モジュール:Auteur

提供: ひつじ小屋別館2代目
移動先: 案内検索
documentation view / edit

Module:Auteur

Lua エラー 2064 行目: invalid capture index


-- This module draw a header of Author page in wikisource
-- it is called by templates {{Author... or {{Auteur...

--[[
-- MediaWiki 1.21wmf9 (070f4b4). 14/02/13
-- MediaWiki 1.21wmf9 (afbf386). 15/02/13 test2
-- MediaWiki 1.21wmf9 (afbf386). 15/02/13 test2
-- MediaWiki     1.21wmf10 (edeb4e1) 18/02/13 test2
-- https://gerrit.wikimedia.org/r/#/c/49601/
-- Patch Set 1 - 96615c97b03bbfacb27e749a1d42971429d76852 (gitweb)

3.25 Scribunto

	6 days ago Brad JorschMake our loader work like Lua's built-in loaders 15-6=9/2/13
    git #5584810 - Make our loader work like Lua's built-in loaders
    https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Scribunto.git;a=commit;h=5584810c2d69602b33297821dd7467742722980f
    https://gerrit.wikimedia.org/r/gitweb?p=mediawiki/extensions/Scribunto.git;a=commit;h=fddf05c0566aca35bc10b0b8fa4abed8668b7134
    
    git #8d02895 - Create wmf/1.21wmf9 branch and update .gitreview
    
    2013-01-31 Brad JorschLua library support functions
    git #4c69b13 - Lua library support functions
    git #0a8a07d - Fix package.loaded and other cleanups
     
--]]

--[[
editing code UTF-16 (MacRoman ?)
Exemple tous paramètres :
{{Auteur |c=:|options=fr test params
|nom=Hugo|prénom=Victor|prénomGall= Arthur
|cle=Hugo Victor|initiale=H
|image=Victor Hugo.jpg |description=écrivain français
|texte=vie |categorie=Auteurs |lien=du |liaison=de l'
|texteNaissance=a |categorieNaissance=Auteurs
|incertitudeNaissance= vers |lienNaissance=du |liaisonNaissance=en
|anneeNaissance= 1802 |siecleNaissance= 19
|texteDeces=a |categorieDeces=Auteurs
|incertitudeDeces= après |lienDeces= du |liaisonDeces=en
|anneeDeces= 1885 |siecleDeces= 19
|droits=non |pseudo=Monsieur Legrand
|genre=Romanciers/Poètes/Auteurs de théatre
|langue=français |pays=France/Italie/Grèce
|metier=Académiciens/Personnalités politiqp.md_dataues
|prix=Prix Nobel de littérature
|VIAF=34452139|NLA=35096649|BNF=cb11888266r|SELIBR=34648|PND=11850133X|LCCN=n/50/23101
|border=0
}}

* Init of unit tests. test_list = table
* Begin of unit tests :
* 1 Site tested : mw.uri.fullUrl = //fr.wikisource.org/wiki/Module:Auteur.
* 2 Environment : Mediawiki 1.21wmf10 (d6c6dba) version UTC 2013-03-01 21:53:59.
* 3 Runtime and spaces : server UTC 2013-03-04 01:09:22, namespace=Modèle module_space=Module, template_space=Modèle viewErrors=true.
* 4 frame.args Error : frame.args.lastname = "error". The OK value was "OK" = frame:getParent().args.lastname.
* 5 sub table write Test OK : sub table write OK. / / / result OKOK  ; exec_ok=true ; value_ok=true ; var_tested=td.C.X ; value_before=xx ; value_after=okvalue ; A=aa ; Y=yy .
* 6 Is Scribunto complete ? Error : Scribunto is not complete. / / /  ; math=table ; os=table ; package=table ; string=table ; table=table ; mw=table ; frame=table ; mw.language=table ; mw.message=nil ; mw.site=table ; mw.title=nil ; mw.uri=table ; mw.ustring=table .
* End of unit tests. Statistic count : Nerr=2 / Ntests=6

-- local MW = require "Module:mw"

--]]

-- Variables et fonctions de base utiles partout
local catView = "" -- = ":" to display a category to document it rather than truly categorize
local doc_args_import_all -- Documentation des arguments dés leur lecture

--	Options de maitrise du fonctionnement de ce module
local local_options = " " -- options normales venant du modèle, normal options from template
--	options=fr params docavant doc-min docmax docdef docnotice doc-apres docligne
--	local debug_options = " " -- pas d'options de debug du module par edit
local debug_options = " unitest debug erreurs params docavant no-box no-cat doc-min doc-max doc-notice doc-def docligne not-ices tra-ck " -- options de debug du module par edit

local option = function(key, opt)
	-- if option("nocat") then cat = "" end
	-- Si le mot cle key est parmi les mots options, repondre true
	-- Chercher dans local_options et ( opt ou debug_options )
	-- Options de documentation : docmin docmax docnotice docdef docligne docavant docapres params
	-- Autres options : en es fr unitest notices nobox nocat track
	-- Veiller à toujours séparer les mots par des espaces
	-- On peut désactiver les options en supprimant les mots clés ou en les coupant.
	-- Les identifiants de langues permettent de forcer certaines langues.
	-- Les erreurs n'apparaissent que dans les espaces de noms Modèle ou Module.
	if type(key) ~= "string" then return false end
	local options = " " .. local_options .. " "
	if type(opt) == "string"
	then options = options .. opt .. " " -- options du modèle et de l'appel si définies
	else options = options .. debug_options .. " " end -- options du modèle et de debug sinon
	key = " " .. key .. " " -- chercher les mots clefs exacts et non ceux inclus dans un autre mot
	local n = string.find(options, key)
	-- si le mot cle est parmi les mots options, repondre true
	return ( nil ~= n )
end -- local option = function(key, opt)

local options_change = function(old, new, chg)
	-- local_options = options_change(local_options, Argts.argv("options", tr), "init")
	-- local_options = options_change(local_options, debug_options, "test")
	if chg == nil then
		-- if type(old) == "string" then
		return old
	else
		-- if type(new) == "string" then
		return new
	end
	return ""
end -- local options_change = function(chg, old, new)

local trc = "<br/>* Modele:Auteur trace "
local trck_on = false
local trck = function(x)
	if trck_on then trc = trc .. tostring(x) end
end

local table_iterator = function(t) -- iterator to use all elements of a table, one by one
	-- for noticeN in table_iterator(notices_properties) do
	-- modele : function list_iter (t)
	if type(t) ~= "table" then return { }, 0 ,0 end
	local i = 0
	local n = table.getn(t)
	return function ()
		i = i + 1
		n = table.getn(t)
		if t[i] ~= nil then return t[i], i ,n end
	end
end

local toUTF8 = function(t)
	-- convertir un simple texte en UTF8 pour URL
	-- text = "Bibliothèque d'autorité (Suède)"
	-- wptx = "Biblioth%%C3%%A8que%%20d%%27autorit%%C3%%A9%%20%%28Su%%C3%%A8de%%29"
	if type(t) ~= "string" then t = "" end
	t = string.gsub(t, "%s", "%%20")
	t = string.gsub(t, "'", "%%27")
	t = string.gsub(t, "%(", "%%28")
	t = string.gsub(t, "%)", "%%29")
	t = string.gsub(t, "é", "%%C3%%A9")
	t = string.gsub(t, "è", "%%C3%%A8")
	return t
end

--[[
 *		GESTION DES PARAMETRES DU MODELE, MANAGING PARAMETERS OF THE TEMPLATE
 * 
 * La gestion des paramètres permet de :
 *	* Lire et mémoriser tous des paramètres fournis par le modèle (voir arg_input arg_memorize)
 *	* S'adapter à la langue du wiki ou une autre (voir arg_lang)
 *	* Lire ou modifier simplement la valeur mémorisée chaque fois que nécessaire, indépendamment de la langue (voir argv arg_memorize)
 *	* Lister les paramètres, tous(docmax), ou ceux définis(docdef), ou selon la spécialisation (docmin, doc1 à doc3)
 *	* Aider à documenter le modèle selon divers aspects, types, usages ...
 *	* Lire d'abord tous les paramètres définis, puis calculer les interactions des noms, prénoms, et autres.
 *	* Développer la vérification des paramètres, de leurs valeurs, de leurs interdépendances.
 * Une table args_known décrit les paramètres, leurs types, leurs valeurs et leurs appelations dans diverses langues.
 * Les types sont ctr = controle, dat = donnée, ntc = notice, opt = options, syn = synonyme, prg = géré uniquement par le programme
 * Les langues sont : en = anglais, es = espagnol, fr = français et il est facile d'en ajouter.
 * L'objet Argts, tables et fonctions, est développé ici pour être déplacée dans un module indépendant et partagé.
 * Le 2013-01-27, l'objet Argts est prévue pour fonctionner comme une classe, avec héritage et fonction New, mais n'est pas encore validée.
--]]

--[[
{{Auteur |options=fr par-ams docavant doc-min docmax docdef docnotice doc-apres docligne
 |c=x:|border=0
 | nom = Rimbaud | prénom = Arthur | cle = Rimbaud | prénomGall= Arthur
 | description = Poète français très connu.
 | naissance = 1854 | deces = 1891 | image = Carjat Arthur Rimbaud 1872 n2.jpg
 | droits = 70 | initiale = R | wikipedia    = Arthur Rimbaud
 | wikiquote    =  Arthur Rimbaud | commons      =  Arthur Rimbaud | commonscat   = 
|texte=vie |categorie=Auteurs |lien=du |liaison=de l'
|texteNaissance=a |categorieNaissance=Auteurs
|incertitudeNaissance= vers |lienNaissance=du |liaisonNaissance=en
|anneeNaissance= 1802 |siecleNaissance= 19 
|texteDeces=a |categorieDeces=Auteurs
|incertitudeDeces= après |lienDeces= du |liaisonDeces=en
|anneeDeces= 1885 |siecleDeces= 19
|droits=non |pseudo=Monsieur Legrand
|genre=Romanciers/Poètes/Auteurs de théâtre |langue=français |pays=France/Italie/Grèce
|metier=Académiciens/Personnalités politiques |prix=Nobel de littérature
 |VIAF=34452139 |NLA=35096649 |BNF=cb11888266r |SELIBR=34648 |PND=11850133X |LCCN=n/50/23101
 |ARC=34452139 |ISBN=123456789 |OCLC=1b5g6t7e |SWD=11/224/488 |ARCitem=Robert/Alain/Paul
 |WORLDCATch=Andrea/Mickel |ARCid=34-452-139
}}
--]]

-- local TradArgs = require "Module:Multilingual_Arguments"

--[ [ -- Module:Multilingual_Arguments start

local Trad = { } -- Traductions des textes locaux, sur le modèle de ProofreadPage.i18n.php $messages = array();
Trad['qqq'] = {
	-- qqq is a description of each text or peculiarities.
	-- qqq es una descripción de cada texto o peculiaridades.
	-- qqq est une description de chaque texte, ou de ses particularités.
	-- Arguments from frame:getParent()
	c							= 'c',
	options						= 'options',
	lastname					= 'lastname',
	initiale					= 'initiale',
	familyname					= 'familyname',
	firstname					= 'firstname',
	pseudonym					= 'pseudonym',
	title						= 'title',
	Galliname					= 'lastname',
	sex							= 'sex',
	sortkey						= 'sortkey',
	image						= 'image',
	birthyear					= 'birthyear',
	birth						= 'birth',
	birthcentury				= 'birthcentury',
	birthuncertain				= 'birthuncertain',
	deathyear					= 'deathyear',
	death						= 'death',
	deathcentury				= 'deathcentury',
	deathuncertain				= 'deathuncertain',
	description					= 'description',
	occupation					= 'occupation',
	genre						= 'genre',
	language					= 'language',
	country						= 'country',
	prize						= 'prize',
	rights						= 'rights',
	wikipedia					= 'wikipedia',
	wikiquote					= 'wikiquote',
	commons						= 'commons',
	commonscat					= 'commonscat',
	namespace					= 'space',
	category					= 'category',
	catspace					= 'catspace',

	-- Scans and Notices
	author_Scans				= 'Scans qqq',
	author_Notices				= 'Notices qqq',
	author_cat_birth_year		= 'Notices qqq',
	author_cat_birth_secular	= 'Notices qqq',
	author_cat_birth_epoch		= 'Notices qqq',
	
	-- Error messages
	err_internal_argument_unknown = ' Internal error : the internal argument _X1X_ is unknown in args_import_all. Report the error to improve the model.',
	err_value_re_defined		= ' Error : the value of the argument _X1X_ is already defined. Choose only one argument and value.',
	err_value_missing			= " Error : This argument is required but absent : _X1X_. Should define it.",
	err_none_value				= " Erreur : Error : No argument has been defined.",
	err_internal_notice_wsid	= "Internal error: the internal argument <b>_X1X_</b> is unknown in the records.",

}

-- Trad['en'] = {
-- This repair a Lua bug : Trad[arg_lang]["options"] = value give an error
Trad.en = {
	-- Arguments from frame:getParent()
	c							= 'c',
	options						= 'options',
	lastname					= 'lastname',
	initiale					= 'initiale',
	familyname					= 'familyname',
	firstname					= 'firstname',
	pseudonym					= 'pseudonym',
	title						= 'title',
	Galliname					= 'lastname',
	sex							= 'sex',
	sortkey						= 'sortkey',
	image						= 'image',
	birthyear					= 'birthyear',
	birth						= 'birth',
	birthcentury				= 'birthcentury',
	birthuncertain				= 'birthuncertain',
	deathyear					= 'deathyear',
	death						= 'death',
	deathcentury				= 'deathcentury',
	deathuncertain				= 'deathuncertain',
	description					= 'description',
	occupation					= 'occupation',
	genre						= 'genre',
	language					= 'language',
	country						= 'country',
	prize						= 'prize',
	rights						= 'rights',
	wikipedia					= 'wikipedia',
	wikiquote					= 'wikiquote',
	commons						= 'commons',
	commonscat					= 'commonscat',
	namespace					= 'space',
	category					= 'Category',
	catspace					= 'catspace',

	-- Scans and Notices
	author_Scans				= 'Scans in',
	author_Notices				= 'Notices',
	author_cat_birth_year		= 'Birth in _year_',
	author_cat_birth_secular	= 'Birth in _secular_ secular',
	author_cat_birth_epoch		= 'Birth in _epoch_',
	
	-- Error messages
	err_error_list_head			= "Error while displaying this template :",
	err_internal_argument_unknown = 'Error: parameter "<b>_X1X_</b>" is unknown in this template. Check the name or flag this gap.',
	err_value_re_defined		= "Error : the value of the argument <b>_X1X_</b> is already defined. Choose only one argument and value.",
	err_value_missing			= "Error : This argument is required but absent : <b>_X1X_</b>. Should define it.",
	err_none_value				= "Erreur : Error : No argument has been defined.",
	err_internal_notice_wsid	= "Internal Error: Report that the internal argument <b>_X1X_</b> is unknown in the records.",
}

-- Trad['es'] = {
-- This repair a Lua bug : Trad[arg_lang]["options"] = value give an error
Trad.es = {
	-- Arguments from frame:getParent()
	c							= 'c',
	options						= 'options',
	lastname					= 'nombre',
	initiale					= 'initiale',
	familyname					= 'primernombre',
	firstname					= 'apellido',
	pseudonym					= 'apodo',
	title						= 'título',
	Galliname					= 'apellidoGalli',
	sex							= 'sexo',
	sortkey						= 'especie clave',
	image						= 'imagen',
	birthyear					= 'año de nacimiento',
	birth						= 'nacimiento',
	birthcentury				= 'siglo de nacimiento',
	birthuncertain				= 'nacimiento incierto',
	deathyear					= 'año de la muerte',
	death						= 'muerte',
	deathcentury				= 'siglo de la muerte',
	deathuncertain				= 'muerte incierto',
	description					= 'descripción',
	occupation					= 'profesión',
	genre						= 'tipo',
	language					= 'lengua',
	country						= 'país',
	prize						= 'premio',
	rights						= 'derechos',
	wikipedia					= 'wikipedia',
	wikiquote					= 'wikiquote',
	commons						= 'commons',
	commonscat					= 'commonscat',
	namespace					= 'espacio',
	category					= 'Categoría',
	catspace					= 'catespacio',

	-- Scans and Notices
	author_Scans				= 'Escanea en',
	author_Notices				= 'Avisos',
	author_cat_birth_year		= 'Naissance en _year_',
	author_cat_birth_secular	= 'Naissance au _secular_ si&egrave;cle',
	author_cat_birth_epoch		= 'Birth in _epoch_',
	
	-- Los mensajes de error
	err_error_list_head			= "Error mientras se muestra este modelo :",
	err_internal_argument_unknown = 'Error: El parámetro "<b>_X1X_</b>" es desconocido en este modelo. Compruebe el nombre o marca esta brecha.',
	err_value_re_defined		= "Error : el valor del argumento <b>_X1X_</b> ya se ha definido. Elige uno sólo argumento y valor.",
	err_value_missing			= "Error : Este argumento es necesario pero ausente : <b>_X1X_</b>. Debe definir.",
	err_none_value				= "Error : Ningún argumento ha sido definido.",
	err_internal_notice_wsid	= "Error interno: Informe que el argumento interno <b>_X1X_</b> es desconocida en los registros.",
}

-- Trad['fr'] = {
-- This repair a Lua bug : Trad[arg_lang]["options"] = value give an error
Trad.fr = {
	-- Arguments from frame:getParent()
	c							= 'c',
	options						= 'options',
	lastname					= 'nom',
	initiale					= 'initiale',
	familyname					= 'nomfamille',
	firstname					= 'prénom',
	pseudonym					= 'pseudo',
	title						= 'titre',
	Galliname					= 'prénomGall',
	sex							= 'sexe',
	sortkey						= 'cle',
	image						= 'image',
	birthyear					= 'anneeNaissance',
	birth						= 'naissance',
	birthcentury				= 'siecleNaissance',
	birthuncertain				= 'incertitudeNaissance',
	deathyear					= 'anneeDeces',
	death						= 'deces',
	deathcentury				= 'siecleNaissance',
	deathuncertain				= 'incertitudeDeces',
	description					= 'description',
	occupation					= 'metier',
	genre						= 'genre',
	language					= 'langue',
	country						= 'pays',
	prize						= 'prix',
	rights						= 'droits',
	wikipedia					= 'wikipedia',
	wikiquote					= 'wikiquote',
	commons						= 'commons',
	commonscat					= 'commonscat',
	namespace					= 'espace',
	category					= 'Category',
	catspace					= 'catspace',

	-- Scans and Notices
	author_Scans				= 'Scans sur',
	author_Notices				= 'Notices',
	author_cat_birth_year		= 'Naissance en _year_',
	author_cat_birth_secular	= 'Naissance au _secular_ si&egrave;cle',
	author_cat_birth_epoch		= 'Birth in _epoch_',
	
	-- Messages d'erreur
	err_error_list_head			= 'Erreurs ou remarques sur les paramètres de ce modèle :',
	err_internal_argument_unknown = 'Erreur : ce paramètre "<b>_X1X_</b>" est inconnu dans ce modèle. Vérifier ce nom ou signaler ce manque.',
	err_value_re_defined		= "Erreur : la valeur de l'argument <b>_X1X_</b> est déjà définie. Choisir un seul argument et une seule valeur.",
	err_value_missing			= "Erreur : Cet argument est nécessaire mais absent : <b>_X1X_</b>. Il faut le définir.",
	err_none_value				= "Erreur : Aucun argument n'a été défini.",
	err_internal_notice_wsid	= "Erreur interne : Signalez que l'argument interne <b>_X1X_</b> est inconnu dans les notices.",
	
} -- Trad

local arg_lang = "fr" -- {{CONTENTLANG}} -- = ":" to display a category to document it rather than truly categorize
-- Trad[arg_lang] = { }
-- Trad[arg_lang]["options"] = " "
local args_trad = { } -- Trad[arg_lang] -- translation of template identifier and texts
if arg_lang == "en" then args_trad = Trad_en end
if arg_lang == "es" then args_trad = Trad_es end
if arg_lang == "fr" then args_trad = Trad_fr end
local args_val = nil -- direct acces to values of arguments and parameters linked
local args_source = nil -- arguments sources au niveau du module

function Trad.txt(key) -- give the translation of indentified texts, or arguments indentifier, or errors messages
	local t = args_trad[key]
	if t == nil then t="" end
	return t
end

function Trad.init_lang(_lang)
	-- if Trad.init_lang(_lang) == _lang then OK
	-- en : init or change the language and its table
	-- es : inicializar o cambiar el idioma y su mesa
	-- fr : initialiser ou modifier la langue et sa table
	local args_table = nil
	if type(_lang) ~= "string" then return nil end
	-- args_table = Trad[_lang]
	-- This repair a Lua bug : Trad[arg_lang]["options"] = value give an error
--	if _lang == "en" then args_table = Trad_en end
--	if _lang == "es" then args_table = Trad_es end
--	if _lang == "fr" then args_table = Trad_fr end
	if _lang == "en" then args_table = Trad.en end
	if _lang == "es" then args_table = Trad.es end
	if _lang == "fr" then args_table = Trad.fr end
	if type(args_table) == "table" then
		arg_lang = _lang
		args_trad = args_table
		return arg_lang
	else
		return nil
	end
end

local local_erreurs = { } -- collecte de toutes les erreurs
local erreur_add = function(wt_ref, v1, v2, v3, v4, v5)
	--	erreur_add("err_value_re_defined", k, key, xyz) -- pick wt_ref, replace _XnX_ by vN, keep error text
	if type(wt_ref) ~= "string" then return "" end
--	if args_trad == nil then args_trad = Trad[arg_lang] end -- translation of template identifier and texts end
	local wt = args_trad[wt_ref]
	wt = tostring(wt)
	if v1 ~= nil then wt = string.gsub(wt, "_X1X_", tostring(v1) ) end
	if v2 ~= nil then wt = string.gsub(wt, "_X2X_", tostring(v2) ) end
	if v3 ~= nil then wt = string.gsub(wt, "_X3X_", tostring(v3) ) end
	if v4 ~= nil then wt = string.gsub(wt, "_X4X_", tostring(v4) ) end
	if v4 ~= nil then wt = string.gsub(wt, "_X5X_", tostring(v5) ) end
	table.insert(local_erreurs, wt)
	return wt
end
local erreur_lister = function(titre)
	local erreurs_wt = ""
	if type(titre) ~= "string" then
		titre = args_trad["err_error_list_head"]
	end
	for i, err in pairs(local_erreurs) do -- Pour tous les parametres connus
		if err ~= "nil" then
			erreurs_wt = erreurs_wt .. '⦁ ' .. '<span style="color:red;" >' .. tostring(err) .. '</span>' .. '<br/>'
		end
	end
	if erreurs_wt == "" then return "" end
	if type(titre) == "string" then erreurs_wt = '<br/>' .. titre .. '<br/>' .. erreurs_wt end
	return erreurs_wt
end

local Argts = {

    args_known_default = { -- wsdata translations
		-- Argts in order without names, with their keyword for use as others arguments
		-- Argts dans l'ordre, non nommés, avec leur keyword pour traitement comme les autres arguments

--[ [		
		"lastname", -- 1
		"firstname", -- 2
		"birthyear", -- 3
		"deathyear", -- 4
--] ]

		-- The arguments for authority records are treated separately
		-- Les arguments pour les notices d'autorités sont traités à part
		
		-- special arguments to modify the fonctions and outputs of this module
		-- arguments speciaux pour modifier le fonctionnement et les sorties de ce module
		
		c =				{val = "", typ = "opt", need = "0", list = 1,
			keyword = "c", old = "ws-catview"},

		options =		{val = "", typ = "opt", need = "0", list = 1,
			keyword = "options", old = "ws-options"},

		-- All arguments have a keyword parameter identical to the registration name, except synonyms
		-- Tous les arguments ont un parametre keyword identique au nom d'enregistrement, sauf les synonymes
				
		lastname =		{val = "", typ = "dat", need = "1", list = 2,
			keyword = "lastname", old = "ws-name"},
		
		initiale =		{val = "", typ = "dat", need = "1", list = 2,
			keyword = "initiale", old = "ws-initiale"},

		familyname =	{val = "", typ = "dat", need = "0", list = 9,
			keyword = "familyname", old = "ws"},

		firstname =		{val = "", typ = "dat", need = "0", list = 2,
			keyword = "firstname", old = "ws-firstname"},

		pseudonym =		{val = "", typ = "ctr", need = "0", list = 9,
			keyword = "pseudonym", old = "ws"},

		title =			{val = "", typ = "dat", need = "0", list = 9,
			keyword = "title", old = "ws"},

		Galliname =		{val = "", typ = "dat", need = "0", list = 9,
			keyword = "Galliname", old = "ws-firstgall"},

		sex =			{val = "", typ = "dat", need = "0", list = 9,
			keyword = "sex", old = "sexe"},

		sortkey =		{val = "", typ = "dat", need = "0", list = 9,
			keyword = "sortkey", old = "ws-key"},

		image =			{val = "", typ = "ctr", need = "0", list = 2,
			keyword = "image", old = "ws-image"},
			
		birthyear =		{val = "", typ = "dat", need = "0", list = 2,
			keyword = "birthyear", old = "ws-naissance ws_birthdate"},

		birth =			{val = "", typ = "syn", need = "0", list = 1,
			keyword = "birthyear", old = "ws-naissance"},

		birthcentury =	{val = "", typ = "dat", need = "0", list = 2,
			keyword = "birthcentury", old = "siecleNaissance"},

		birthuncertain ={val = "", typ = "dat", need = "0", list = 3,
			keyword = "birthuncertain", old = "incertitudeNaissance"},

		deathyear =		{val = "", typ = "dat", need = "0", list = 2,
			keyword = "deathyear", old = "ws-deces ws_deathdate"},

		death =			{val = "", typ = "syn", need = "0", list = 1,
			keyword = "deathyear", old = "ws-deces"},

		deathcentury =	{val = "", typ = "dat", need = "0", list = 2,
			keyword = "deathcentury", old = "siecleNaissance"},

		deathuncertain ={val = "", typ = "dat", need = "0", list = 3,
			keyword = "deathuncertain", old = "incertitudeDeces"},

		description =	{val = "", typ = "ctr", need = "0", list = 1,
			keyword = "description", old = "ws_description"},

		occupation =	{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "occupation", old = "ws-metier"},

		genre =			{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "genre", old = "ws-genre"},

		language =		{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "language", old = "ws-language"},

		country =		{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "country", old = "ws-country"},

		prize =			{val = "", typ = "ctr", need = "0", list = 4,
			keyword = "prize", old = "ws-prix"},

		rights =		{val = "", typ = "ctr", need = "0", list = 1,
			keyword = "rights", old = "rights"},

		wikipedia =		{val = "", typ = "ctr", need = "0", list = 2,
			keyword = "wikipedia", old = "ws-wikipedia"},

		wikiquote =		{val = "", typ = "ctr", need = "0", list = 2,
			keyword = "wikiquote", old = "ws-wikiquote"},

		commons =		{val = "", typ = "ctr", need = "0", list = 2,
			keyword = "commons", old = "ws-commons"},

		commonscat =	{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "commonscat", old = "ws-commons-category"},

		namespace =		{val = "", typ = "ctr", need = "1", list = 4,
			keyword = "namespace", old = "ws-namespace"},

		category =		{val = "", typ = "ctr", need = "0", list = 3,
			keyword = "category", old = "ws-category"},

		-- arguments for notices's properties

		ARC =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARC", old = "ws-ARC"},

		ARCid =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARCid", old = "ws-ARCid"},

		ARCitem =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARCitem", old = "ws-ARCitem"},

		ARCorg =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARCorg", old = "ws-ARCorg"},

		ARCsub =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARCsub", old = "ws-ARCsub"},

		BNF =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "BNF", old = "ws-BNF"},

		GKD =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "GKD", old = "ws-GKD"},

		GKD_V1 =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "GKD_V1", old = "ws-GKD-V1"},

		IA =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "IA", old = "ws-IA"},

		ARCHIVE =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ARCHIVE", old = "ws-ARCHIVE"},

		IBL =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "IBL", old = "ws-IBL"},

		IBLid =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "IBLid", old = "ws-IBLid"},

		IBLbook =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "IBLbook", old = "ws-IBLbook"},

		ISBN =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ISBN", old = "ws-ISBN"},

		ISFDB =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ISFDB", old = "ws-ISFDB"},

		ISFDBid =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ISFDBid", old = "ws-ISFDBid"},

		ISFDBpub =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ISFDBpub", old = "ws-ISFDBpub"},

		ISFDBtitle =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ISFDBtitle", old = "ws-ISFDBtitle"},

		LCCN =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "LCCN", old = "ws-LCCN"},

		LT =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "LT", old = "ws-LT"},

		OCLC =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "OCLC", old = "ws-OCLC"},

		OL =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "OL", old = "ws-OL"},

		PND =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "PND", old = "ws-PND"},

		SELIBR =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "SELIBR", old = "ws-SELIBR"},

		SUDOC =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "SUDOC", old = "ws-SUDOC"},

		SWD =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "SWD", old = "ws-SWD"},

		ULAN =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "ULAN", old = "ws-ULAN"},

		VIAF =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "VIAF", old = "ws-VIAF"},

		WORLDCATID =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "WORLDCATID", old = "ws-WORLDCATID"},

		XXX =		{val = "", typ = "not", need = "0", list = 3,
			keyword = "XXX", old = "ws-XXX"},

		-- arguments managed only by program, not read from template
		--	prm.arg_memorize("catspace", frame:preprocess("{{ns:Category}}")) -- memorize the localized namespace "Category"
		catspace =		{val = "", typ = "prg", need = "0", list = 9,
			keyword = "catspace", old = "catspace"},
			
	}, -- local Argts args_known_default

--[[ nameList of notices's properties
	-->|ARCid|ARCitem|ARCorg|ARCsub<!--
	-->|ARC=National Archives and Records Administration<!--
	-->|BNF=Bibliothèque nationale de France<!--
	-->|GKD|GKD-V1=Gemeinsame Kšrperschaftsdatei<!--
	-->|IA|ARCHIVE=Internet Archive<!--
	-->|IBL|IBLid|IBLbook=Internet Book List<!--
	-->|ISBN=International Standard Book Number<!--
	-->|ISFDBid|ISFDBpub|ISFDBtitle<!--
	-->|ISFDB=Internet Speculative Fiction Database<!--
	-->|LCCN=Numéro de contrôle de la Bibliothèque du Congrès<!--
	-->|LT=Library Thing<!--
	-->|OCLC=Online Computer Library Center<!--
	-->|OL=Open Library<!--
	-->|PND=Personennamendatei<!--
	-->|SELIBR=National Library of Sweden<!--
	-->|SUDOC=Système universitaire de documentation<!--
	-->|SWD=Schlagwortnormdatei<!--
	-->|ULAN=Union List of Artist Names<!--
	-->|VIAF=Fichier d'autorité international virtuel<!--
	-->|WORLDCATID=WorldCat<!--
	-->|XXX=XXX autorité<!--
	-->|#default={{{wp|{{{3|}}} }}} <!--
--]]

    args_source_example = { categoryEN = "cat author", imageEN = "Smith.jpg", prize = "Nobel", categorie = "catAuteur", image = "Franc.jpg", prix = "NobelFr", categoria = "catAuteur", imagen = "Espangnol.jpg", premio = "NobelES", },
	
	args_known = nil,
	
	args_source = nil,
	
--	prototype = {args_known = Argts.args_known_default, args_source = Argts.args_source_example, arg_lang = {{CONTENTLANG}}, },
	mt = {},
	mt_index = function (table, key)
		return Argts.prototype[key]
	end,

} -- Argts object

function Argts.prototype()
	Argts.args_known = Argts.args_known_default
	Argts.args_source = Argts.args_source_example
	arg_lang = {{CONTENTLANG}}
end

function Argts.new(o) -- create a new object from the class Argts
	-- see : Objects Classes http://www.lua.org/pil/16.1.html
	-- see : The __index Metamethod http://www.lua.org/pil/13.4.1.html
	-- function Account:new (obj)
	o = o or {}   -- create object if user does not provide one
	-- o.__index = Argts
	o.mt = {}
	o.mt.__index = mt_index
	setmetatable(o, Argts.mt) -- self is a prototype for o
	return o
end

-- local current_space = mw.site.namespaces.name -- present namespace from system
local current_space = "" -- frame:preprocess("{{ns:0}}") -- Module namespace from system
local module_space = "" -- frame:preprocess("{{ns:Module}}") -- Module namespace from system
local template_space = "" -- frame:preprocess("{{ns:Template}}") -- Template namespace from system
local author_space = "" -- frame:preprocess("{{ns:Author}}") -- Category namespace from system
local category_space = "" -- frame:preprocess("{{ns:Category}}") -- Category namespace from system

function Argts.args_init(_known, _source, _lang) -- initialize all the values to "" in arg table
	-- args_init(args_known, args_source, "fr")
	local args_known = Argts.args_known
	local args_source = Argts.args_source_example -- arguments sources au niveau du module
--	category_space = frame:preprocess("{{ns:Category}}") -- {{ns:Category}}
--	prm.arg_memorize("catspace", frame:preprocess("{{ns:Category}}")) -- memorize the localized namespace "Category"
	trck('<br/>* args_init default args_known_default=' .. tostring(Argts.args_known_default) )
	trck(', args_known=' .. tostring(args_known) )
	trck(', args_source_example=' .. tostring(Argts.args_source_example) )
	trck(', Argts.args_source=' .. tostring(args_source) )
	trck(', Argts["args_source"]=' .. tostring(Argts["args_source"]) )
	trck(', module.args_source_example.image=' .. tostring(Argts["args_source_example"]["image"]) )
	trck('<br/> current_space=' .. tostring(current_space) )
	trck(', module_space=' .. tostring(module_space) )
	trck(', template_space=' .. tostring(template_space) )
	trck(', author_space=' .. tostring(author_space) )
	trck(', category_space=' .. tostring(category_space) )
	trck(', arg_lang=' .. tostring(arg_lang) )
	if _known ~= nil then
		args_known = _known
		Argts.args_known = args_known
	end
	if _source ~= nil then
		args_source = _source
		Argts.args_source = _source
	end
	-- arg_lang = {{CONTENTLANG}} -- langue du wiki par defaut
	Trad.init_lang( {{CONTENTLANG}} )
	--if type(_lang) == "string" then
	--	arg_lang = _lang
	--end
	--if arg_lang == "en" then args_trad = Trad_en end
	--if arg_lang == "es" then args_trad = Trad_es end
	--if arg_lang == "fr" then args_trad = Trad_fr end
--	if type(_lang) == "string"
--		then arg_lang = _lang
--		else arg_lang = {{CONTENTLANG}} end
--	if option("en") then arg_lang = "en" end
--	if option("es") then arg_lang = "es" end
--	if option("fr") then arg_lang = "fr" end
--	args_trad = Trad[arg_lang]
	trck('<br/>* args_init usual args_known=' .. tostring(Argts.args_known) )
	trck(', module.args_source.image=' .. tostring(args_source["image"]) )
	trck(', arg_lang=' .. tostring(arg_lang) )
	trck(', catspace=' .. tostring(category_space) )
	trck(', author_space=' .. tostring(author_space) )
end -- Argts.args_init(_known, _source, _lang)

function Argts.arg_memorize(argname, argval, tr) -- memorize the value in local table
	-- arg_memorize("firstname", "Victor")
	local args_known = Argts.args_known
	if tr ~= nil then trck(', arg_memorize call argname='..argname..', argval='..argval) end
	if argname == nil then return "" end
	if argval == nil then return "" end
	local arg_to_mem = args_known[argname]
	if arg_to_mem == nil then return "" end
	arg_to_mem["val"] = argval
	local keyword = arg_to_mem["keyword"]
	return argname, argval
end -- Argts.arg_memorize(argname, argval, tr)

function Argts.argv(argname, tr) -- read arg value from local data, tr = with debug track
--	arg = Argts.argv("name") -- read the argument from local memory, no matter the language of the wiki
--	arg = Argts.argv("name", "tr") -- the same, with a text track of the debug
	local args_known = Argts.args_known
	if tr ~= nil then trck(', argv call argname='..tostring(argname) ) end
	if type(argname) ~= "string" then return "" end
	if args_known[argname] == nil then return "" end
--[[
	if args_known[argname]["typXXX"] == "dat" then
		local keyword = args_known[argname]["keyword"]
		if tr ~= nil then trc=trc..', dat keyword='..tostring(keyword) end
		if keyword == nil then return "" end
		local _known = tostring(args_known[argname]["val"])
		local _data = tostring(Argts.argv(keyword))
		if tr ~= nil then trc=trc..', _known='.._known..', _data='.._data end
		return Argts.argv(keyword)
	end
	if args_known[argname]["typXXX"] == "ctr" then
		local keyword = args_known[argname]["keyword"]
		if tr ~= nil then trc=trc..', ctr keyword='..tostring(keyword) end
		if keyword == nil then return "" end
		local _known = tostring(args_known[argname]["val"])
		local _ctr = tostring(Argts.argv(keyword))
		if tr ~= nil then trc=trc..', _known='.._known..', _ctr='.._ctr end
		return Argts.argv(keyword)
	end
	if args_known[argname]["typXXX"] == "xxx" then
		local keyword = args_known[argname]["keyword"]
		if tr ~= nil then trc=trc..', ctr val='..Argts.argv(keyword) end
		return Argts.argv(keyword)
	end
--]]
	return args_known[argname]["val"] or ""
end -- Argts.argv(argname, tr)

function Argts.arg_input(args_src, argname, tr)
--	multilingual read an arg from the template, memorize it, tr = with debug track
--	arg_input(args_src, "firstname")
--	verify params, and convert nil to ""
	local args_known = Argts.args_known
	if args_src == nil then args_src = Argts.args_source end
	if tr ~= nil then trck(', _known='.._known..', _ctr='.._ctr) end
	local max = table.getn(args_src)
	if tr ~= nil then trck('<br/>* arg_input '..', args_known_default='..tostring(Argts.args_known_default)..', args_known='..tostring(args_known)..', args_src='..tostring(args_src)..', max='..tostring(max) ) end
	local max = table.getn(args_src)
	if tr ~= nil then trck('<br/>* arg_input max='..tostring(max)..', argname='..tostring(argname) ) end
	if type(argname) ~= "string" then argname = "" end
	if tr ~= nil then trck(', argname?='..tostring(argname) ) end
	if argname == "" then return "" end
--	MW.log( ' arg_input argname='..tostring(argname)..', arg_lang='..tostring(arg_lang) ) -- trace to console
	local argname_ = args_known[argname]
	if tr ~= nil then trck(', args_known[argname]='..tostring(args_known[argname]) ) end
	if argname_ == nil then return "" end
	arglingual = args_trad[argname] -- multilingual name of the arg in the template
	if type(arglingual) ~= "string" then arglingual = argname end
	if tr ~= nil then trck(', arglingual?='..tostring(arglingual) ) end
	if type(arglingual) ~= "string" then arglingual = "" end
	if arglingual == "" then return "" end
	if tr ~= nil then trck(', arglingual='..tostring(arglingual) ) end
	local argval = args_src[arglingual] -- multilingual read the arg from the template
	if type(argval) ~= "string" then argval = "" end
	if tr ~= nil then trck(', argval='..tostring(argval) ) end
	Argts.arg_memorize(argname, argval) -- memorize the value in local table
	return trc
--	local t = Trad[arg_lang][argname]
end -- function Argts.arg_input(args_src, argname, tr)

function Argts.args_import_all(args_src, args_kwn)
--	import all arguments from template, or other source
--	Argts.args_import_all(Argts.args_source_example, Argts.args_known_default)
	local err, er1, t2 = "", "", ""
	local key, argval = "kkk", "xxx"
	local argknw, arglingual = nil, ""
	-- This repair a Lua bug : Argts.any_function or Argts.any_table disappears
	if args_src == nil then args_src = Argts.args_source end
	if args_kwn == nil then args_kwn = Argts.args_known_default end
	if arg_input == nil then arg_input = Argts.arg_input end
	if args_kwn == nil then return " args_kwn=nil " end
	if args_src == nil then return " args_src=nil " end
	local max = table.getn(args_kwn)
--	args_trad = Trad[arg_lang] -- translation of template identifier and texts
--	if arg_lang == "en" then args_trad = Trad_en end
--	if arg_lang == "es" then args_trad = Trad_es end
--	if arg_lang == "fr" then args_trad = Trad_fr end
	Trad.init_lang(arg_lang)
	trck('<br/>* args_import_all '..', args_known_default='..tostring(Argts.args_known_default) )
	trck(', args_known='..tostring(args_known)..', args_kwn='..tostring(args_kwn) )
	trck(', args_source='..tostring(args_source)..', args_src='..tostring(args_src) )
	trck(',<br/>* arg_lang=' .. tostring(arg_lang) )
	trck(', max='..tostring(max) )
	trck(', catspace=' .. tostring(category_space) )
	trck(', author_space=' .. tostring(author_space) )
	local arg_found, key_found = false, false
	for k, parm in pairs(args_kwn) do -- Pour tous les parametres connus
		if type(parm) == "string" then -- args en ordre numerique et renvoi vers un argument nommé
			key = tostring(parm)
			k = k
			t2 = " " .. tostring(k) .. "-"
		else
			key = tostring(parm["keyword"])
			k = 0
			t2 = ""
		end -- parm["keyword"] end
		arglingual = tostring(args_trad[key]) -- args_trad OK
		if arglingual == "nil" then arglingual = key end
		argknw = args_kwn[key]
		if argknw == nil then
			err = err .. erreur_add("err_internal_argument_unknown", arglingual)
		else
			local val_prec = tostring(argknw["val"]) -- valeur deja definie
			Argts.arg_input(args_src, key) -- multilingual read an arg
			local val = tostring(Argts.argv(key, tr))
		--	trck( tostring(arglingual) .. ":" )
			if val_prec ~= "" then
				err = err .. erreur_add("err_value_re_defined", arglingual)
			end
			if k == 0 then -- pour les arguments nommés
				argval = tostring(argknw["val"])
			else -- pour les arguments dans l'ordre
				argval = val
			end
			trck(', '..t2..tostring(key)..'['..tostring(arglingual)..']')
			if argknw["typ"] == "prg" then
				-- arguments managed only by program, but read from template
				trck("<b>"..tostring(argval) .. "</b> . . . " )
				arg_found = true
			else
				if type(argval) == "string" then
					if key == "options" then
						trck_on = option("track")
						local_options = argval
						trck(" local_options="..tostring(local_options).." argval=")
						if option("en") then Trad.init_lang("en") end
						if option("en") then Trad.init_lang("es") end
						if option("en") then Trad.init_lang("fr") end
					end
					trck("<b>"..tostring(argval) .. "</b> . . . " )
					arg_found = true
				end
			end
			argneed = tostring(argknw["need"])
			if (argval == "") and (argneed == "1") then
				err = err .. erreur_add(err_value_missing, arglingual.."++")
			end
		end
	end
	if arg_found == false then
				err = err .. erreur_add(err_none_value)
	end
	-- local_erreurs = local_erreurs .. err -- collecte de toutes les erreurs
	if option("erreurs", debug_options) then trck(err) end
	trck("<br/>")
	return err
end -- function Argts.args_import_all(args_src, args_kwn)

function Argts.generDoc1(paramName, k, paramData, opt)
	-- t = t .. generDoc1("nom", "ws-name", "docligne docdef")
	-- Normaliser les parametres et signaler les erreurs
	-- Toujours afficher quelque chose dans la documentation du module ou du modèle.
--	t = t .. " [" .. tostring(argknw) .. "/L=" .. tostring(arglingual) .. "/V=<big><b>" .. tostring(val) .. "</b></big>] ."
	if type(paramName) ~= "string" then
		paramName = " paramName ? "
	end -- signaler l'erreur
	if type(paramData) ~= "string" then paramData = " paramData ? " end -- paramètre vide, non défini
	opt = " "..tostring(opt).." " -- transparent, sinon peut donner nil, non génant
	-- former le texte à afficher
	local retourLigne = "" -- "<br/>"
	local t2=" "..tostring(k) -- .."-"
	if option("docligne", opt) then retourLigne = "" end
	if option("docdef", opt) and (paramData == "") then return "" end
	if k ~= 0 then paramName = t2 end -- pour les parametres non nommés
	return " | " .. paramName .. " = <b>" .. paramData .. "</b>" .. retourLigne
end -- function Argts.generDoc1(paramName, paramId, opt)

local Argtest = { "Rimbaud", "Arthur", options = " debug fr docavant ", 1234, droits = "70", droits = "non", gauche = "ggcchh", deces = "1357", anneeDeces = "1842",  image = "Carjat Arthur Rimbaud 1872 n2.jpg", pays = "France" }

function Argts.generDoc(opt)
	-- Gérer des paramètres pour la documentation du module
	-- "docmax" tous les paramètres existants
	-- "docmin" quelques paramètres de base
	-- "docdef" seulement les paramètres définis, ayant une valeur non nulle
	-- "docnotice" generer les doc des notices
	-- "docligne" mettre tous les paramètres sur une seule ligne
	-- This repair a Lua bug : Argts.any_function or Argts.any_table disappears
	local args_kwn = Argts.args_known_default
	local key, argknw, argval = "", "", ""
	local t, val = "", ""
	local lst = true
	t = t .. "<br/>{{Auteur"
	for k, parm in pairs(args_kwn) do -- Pour tous les parametres connus
		val = ""
		if type(parm) == "string" then -- args en ordre numerique et renvoi vers un argument nommé
			key = tostring(parm)
			k = k
		else
			key = tostring(parm["keyword"])
			k = 0
		end -- parm["keyword"] end
		argknw = args_kwn[key]
--		arglingual = tostring(Trad.txt(key))
		arglingual = tostring(args_trad[key]) -- multilingual name of the arg in the template
		if arglingual == "nil" then arglingual = key end
--		if arglingual type(Argts[key]) == "table" then
--			if Argts[key]["typ"] == "not" then arglingual = key end
--			t = t .. ":" .. tostring(arglingual)
--		end
		val = tostring(argknw["val"])
		lst = false
		if option("docmin", opt) and (parm["list"] == 1) then lst = true end
		if option("docdef", opt) and (val ~= "") then lst = true end
		if option("docmax", opt) then lst = true end
--		t = t .. Argts.generDoc1(arglingual, val, opt)
		lst = true
		if lst then -- lister arg si autorisé
			t = t .. Argts.generDoc1(arglingual, k, val, opt)
		end
	end
	t = t .. "}}<br/><br/>"
	-- if option("erreurs", debug_options) then t = t .. '<span style="color:red;" >' .. local_erreurs .. '</span>' end
	return t
end -- function Argts.generDoc(opt)

local notices_properties = { -- Table of notices's properties, to automate them
	-- REF_0 = reference en un seul numéro comme "cb11888266r"
	-- REF_1/REF_2/REF_3 = reference en trois parties comme "123/456/789 ou "Hugo/Victor/Victor André"
	{base = "ARC",	_id = "ARC",        _wsid = "ws-ARC",		_sauf = "", _space = "", _type = "",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
	{base = "ARC",	_id = "ARCgeo",      _wsid = "ws-ARCgeo",	_sauf = "", _space = "", _type = "Geo",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
	{base = "ARC",	_id = "ARCid",      _wsid = "ws-ARCid",		_sauf = "", _space = "", _type = "Auteur",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
    {base = "ARC",	_id = "ARCitem",    _wsid = "ws-ARCitem",	_sauf = "", _space = "", _type = "Book",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
    {base = "ARC",	_id = "ARCorg",    _wsid = "ws-ARCorg",		_sauf = "", _space = "", _type = "Org",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
    {base = "ARC",	_id = "ARCsub",    _wsid = "ws-ARCsub",		_sauf = "", _space = "", _type = "Auteur",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},
    {base = "ARC",	_id = "ARCHIVE",    _wsid = "ws-ARCsub",		_sauf = "", _space = "", _type = "Auteur",
		text = "National Archives and Records Administration",
		wptx = "National%%20Archives%%20and%%20Records%%20Administration",
		_link= "http://www.archive.org/details/REF_0"},
	{base = "BNF",	_id = "BNF",    _wsid = "BNF",		_sauf = "", _space = "", _type = "Auteur",
		text = "Bibliothèque nationale de France",
		wptx = "Biblioth%%C3%%A8que%%20nationale%%20de%%20France",
		_link= "http://catalogue.bnf.fr/ark:/12148/REF_0"},
	{base = "DNB",	_id = "DNB",    _wsid = "DNB",		_sauf = "", _space = "", _type = "Auteur",
		text = "Bibliothèque nationale allemande",
		wptx = "Biblioth%%C3%%A8que%%20nationale%%20allemande",
		_link= "http://d-nb.info/gnd/REF_0"},
	{base = "GKD",	_id = "GKD",    _wsid = "GKD",		_sauf = "", _space = "", _type = "Auteur",
		text = "Bibliothèque nationale allemande",
		wptx = "Biblioth%%C3%%A8que%%20nationale%%20allemande",
		_link= "http://d-nb.info/gnd/REF_0"},
	{base = "GKD",	_id = "GKD-V1",    _wsid = "GKD-V1",	_sauf = "", _space = "", _type = "Auteur",
		text = "Bibliothèque nationale allemande",
		wptx = "Biblioth%%C3%%A8que%%20nationale%%20allemande",
		_link= "http://d-nb.info/gnd/REF_0"},
	{base = "IA",	_id = "ARCHIVE",    _wsid = "IA",	_sauf = "", _space = "", _type = "Auteur",
		text = "Internet Archive",
		wptx = "Internet%%20Archive",
		_link= "http://www.archive.org/REF_0"},
	{base = "IA",	_id = "IA",    _wsid = "IA",		_sauf = "", _space = "", _type = "Auteur",
		text = "Internet Archive",
		wptx = "Internet%%20Archive",
		_link= "http://www.archive.org/REF_0"},
		
	{base = "IBL",	_id = "IBL",    _wsid = "IBL",		_sauf = "", _space = "", _type = "Auteur",
		text = "Internet Archive",
		wptx = "Internet%%20Archive",
		_link= "http://www.iblist.com/bookREF_0.html"},
		
	{base = "IBL",	_id = "IBLbook",    _wsid = "IBLbook",	_sauf = "", _space = "", _type = "Auteur",
		text = "Internet Archive",
		wptx = "Internet%%20Archive",
		_link= "http://www.iblist.com/bookREF_0.html"},
		
	{base = "IBL",	_id = "IBLid",    _wsid = "IBLid",	_sauf = "", _space = "", _type = "Auteur",
		text = "Internet Book List", -- Pas de page fr, en redirige vers Base de données bibliographiques
		wptx = "Internet%%20Archive",
		_link= "http://www.iblist.com/authorREF_0.html"},
			
--[[
	linkList
	pour memoire, pour chaque nomlien : [ [Catégorie:Nota{{{nomlien|{{{1|}}} }}}] ]
	-->|ISBN=http://fr.wikisource.org/wiki/Spécial:Ouvrages_de_référence/{{{code|{{{2|}}} }}}<!--
	-->|ISFDBid=http://www.isfdb.org/cgi-bin/ea.cgi?{{{code|{{{2|}}} }}}<!-- Auteur:
	-->|ISFDBpub=http://www.isfdb.org/cgi-bin/pl.cgi?{{{code|{{{2|}}} }}}<!--
	-->|ISFDBtitle=http://www.isfdb.org/cgi-bin/title.cgi?{{{code|{{{2|}}} }}}<!--
	-->|ISFDB=http://catalogue.bnf.fr/ark:/12148/{{{code|{{{2|}}} }}}<!--
--]]

--[[ nameList of notices's properties
	-->|ARCid|ARCitem|ARCorg|ARCsub<!--
	-->|ARC=National Archives and Records Administration<!--
	-->|BNF=Bibliothèque nationale de France<!--
	-->|GKD|GKD-V1=Gemeinsame Kšrperschaftsdatei<!--
	-->|IA|ARCHIVE=Internet Archive<!--
	-->|IBL|IBLid|IBLbook=Internet Book List<!--
	-->|ISBN=International Standard Book Number<!--
	-->|ISFDBid|ISFDBpub|ISFDBtitle<!--
	-->|ISFDB=Internet Speculative Fiction Database<!--
	-->|LCCN=Numéro de contrôle de la Bibliothèque du Congrès<!--
	-->|LT=Library Thing<!--
	-->|OCLC=Online Computer Library Center<!--
	-->|OL=Open Library<!--
	-->|PND=Personennamendatei<!--
	-->|SELIBR=National Library of Sweden<!--
	-->|SUDOC=Système universitaire de documentation<!--
	-->|SWD=Schlagwortnormdatei<!--
	-->|ULAN=Union List of Artist Names<!--
	-->|VIAF=Fichier d'autorité international virtuel<!--
	-->|WORLDCATID=WorldCat<!--
	-->|XXX=XXX autorité<!--
	-->|#default={{{wp|{{{3|}}} }}} <!--
--]]
	
    {base = "ISNI",	_id = "ISNI",      _wsid = "ws-ISNI",	    _sauf = "", _space = "", _type = "Auteur",
		text = "International Standard Name Identifier",
		wptx = "International%%20Standard%%20Name%%20Identifier",
		_link="http://isni.oclc.nl/DB=1.2/SET=10/TTL=1/CMD?ACT=SRCHA&IKT=8006&SRT=&TRM=REF_0"},
	{base = "OCLC",	_id = "OCLC",       _wsid = "ws-OCLC",		_sauf = "", _space = "", _type = "Auteur",
		text = "Online Computer Library Center",
		wptx = "Online%%20Computer%%20Library%%20Center",
		_link="http://www.worldcat.org/oclc/REF_0"},
	{base = "PND",	_id = "PND",   	    _wsid = "ws-PND",		_sauf = "", _space = "Portail", _type = "Auteur",
		text = "Personennamendatei",
		wptx = "Personennamendatei",
		_link="http://d-nb.info/gnd/REF_0"},
--[[
	linkList
	pour memoire, pour chaque nomlien : [ [Catégorie:Nota{{{nomlien|{{{1|}}} }}}] ]
	-->|ARCgeo=http://arcweb.archives.gov/arc/action/ExecuteRelatedGeographicalSearch?id={{{code|{{{2|}}} }}}&relationship=AD_SUBJECT<!--
	-->|ARC<!--
	-->|ARCid=http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id={{{code|{{{2|}}} }}}<!--
	-->|ARCitem=http://arcweb.archives.gov/arc/action/ExternalIdSearch?id={{{code|{{{2|}}} }}}<!--
	-->|ARCorg=http://arcweb.archives.gov/arc/action/ExecuteRelatedOrganizationSearch?id={{{code|{{{2|}}} }}}&relationship=AD_SUBJECT<!--
	-->|ARCsub=http://arcweb.archives.gov/arc/action/ExecuteRelatedTopicalSubjectsSearch?id={{{code|{{{2|}}} }}}<!--
	-->|ARCHIVE=http://www.archive.org/details/{{{code|{{{2|}}} }}}<!--
	-->|BNF=http://catalogue.bnf.fr/ark:/12148/{{{code|{{{2|}}} }}}<!--
	-->|DNB=http://d-nb.info/gnd/{{{code|{{{2|}}} }}}<!--
	-->|GKD=http://d-nb.info/gnd/{{{code|{{{2|}}} }}}<!--
	-->|GKD-V1=http://d-nb.info/gnd/{{{code|{{{2|}}} }}}<!--
	-->|IA|ARCHIVE=http://catalogue.bnf.fr/ark:/12148/{{{code|{{{2|}}} }}}<!--
	-->|IBL<!--
	-->|IBLbook=http://www.iblist.com/book{{{code|{{{2|}}} }}}.html<!--
	-->|IBLid=http://www.iblist.com/author{{{code|{{{2|}}} }}}.html<!--
	-->|ISBN=http://fr.wikisource.org/wiki/Spécial:Ouvrages_de_référence/{{{code|{{{2|}}} }}}<!--
	-->|ISFDBid=http://www.isfdb.org/cgi-bin/ea.cgi?{{{code|{{{2|}}} }}}<!-- Auteur:
	-->|ISFDBpub=http://www.isfdb.org/cgi-bin/pl.cgi?{{{code|{{{2|}}} }}}<!--
	-->|ISFDBtitle=http://www.isfdb.org/cgi-bin/title.cgi?{{{code|{{{2|}}} }}}<!--
	-->|ISFDB=http://catalogue.bnf.fr/ark:/12148/{{{code|{{{2|}}} }}}<!--
	-->|LCCN=http://id.loc.gov/authorities/names/{{ParmPart|1|{{{code|{{{2|}}} }}} }}{{ParmPart|2|{{{code|{{{2|}}} }}} }}{{padleft:{{ParmPart|3|{{{code|{{{2|}}} }}} }}|6|0}}.html<!--
	-->|LCCNid=http://id.loc.gov/authorities/names/{{ParmPart|1|{{{code|{{{2|}}} }}} }}{{ParmPart|2|{{{code|{{{2|}}} }}} }}{{padleft:{{ParmPart|3|{{{code|{{{2|}}} }}} }}|6|0}}.html<!--
	-->|LCCNbook=http://lccn.loc.gov/{{{code|{{{2|}}} }}}<!--
	-->|LT=http://www.librarything.com/work/{{{code|{{{2|}}} }}}<!--
	-->|NLA=http://nla.gov.au/anbd.aut-an{{{code|{{{2|}}} }}}<!--
	-->|OCLC=http://www.worldcat.org/oclc/{{{code|{{{2|}}} }}}<!--
	-->|OL=http://openlibrary.org/books/{{{code|{{{2|}}} }}}<!--
	-->|PND=http://d-nb.info/gnd/{{{code|{{{2|}}} }}}<!--
	-->|SELIBR=http://libris.kb.se/auth/{{{code|{{{2|}}} }}}<!--
	-->|SUDOC=http://www.idref.fr/{{{code|{{{2|}}} }}}<!--
	-->|SWD=http://d-nb.info/gnd/{{{code|{{{2|}}} }}}<!--
	-->|ULAN=http://www.getty.edu/vow/ULANFullDisplay?find=&role=&nation=&subjectid={{{code|{{{2|}}} }}}<!--
	-->|VIAF=http://viaf.org/viaf/{{{code|{{{2|}}} }}}<!--
	-->|WORLDCAT=http://www.worldcat.org/search?qt=worldcat_org_all&q={{ParmPart|1|{{{code|{{{2|}}} }}} }}+{{ParmPart|2|{{{code|{{{2|}}} }}} }}<!-- http://www.worldcat.org/search?qt=worldcat_org_all&q=Alain+Fournier
	-->|WORLDCATch=http://www.worldcat.org/search?q={{ParmPart|1|{{{code|{{{2|}}} }}} }}-{{ParmPart|2|{{{code|{{{2|}}} }}} }}&qt=owc_search<!-- http://www.worldcat.org/search?q=Alain-Fournier&qt=owc_search
	-->|WORLDCATID=http://www.worldcat.org/identities/{{{code|{{{2|}}} }}}<!--
	-- http://www.worldcat.org/search?q=Alain-Fournier&qt=owc_search
	-- http://www.worldcat.org/search?qt=worldcat_org_all&q=Alain+Fournier
	-->|XXX=http://catalogue.bnf.fr/ark:/12148/{{{code|{{{2|}}} }}}[ [Catégorie:Nota{{{nomlien|{{{1|xxx}}} }}}] ]<!--
	-->|#default=http://fr.wikisource.org/wiki/Modèle:Notice_Autorité<!--
--]]

--[[
	wsdata["ws-ARC"] = args.ARC
	wsdata["ws-ARCgeo"] = args.ARCgeo
	wsdata["ws-ARCid"] = args.ARCid
	wsdata["ws-ARCitem"] = args.ARCitem
	wsdata["ws-ARCorg"] = args.ARCorg
	wsdata["ws-ARCsub"] = args.ARCsub
	wsdata["ws-ARCHIVE"] = args.ARCHIVE
	wsdata["ws-BNF"] = args.BNF
	wsdata["ws-GKD"] = args.GKD
	wsdata["ws-GKD-V1"] = args["GKD-V1"]
	wsdata["ws-IA"] = args.IA
	wsdata["ws-IBL"] = args.IBL
	wsdata["ws-IBLbook"] = args.IBLbook
	wsdata["ws-IBLid"] = args.IBLid
	wsdata["ws-ISBN"] = args.ISBN
	wsdata["ws-ISNI"] = args.ISNI
	wsdata["ws-LCCN"] = args.LCCN
	wsdata["ws-OCLC"] = args.OCLC
	wsdata["ws-NLA"] = args.NLA
	wsdata["ws-PND"] = args.PND
	wsdata["ws-SELIBR"] = args.SELIBR
	wsdata["ws-SWD"] = args.SWD
	wsdata["ws-VIAF"] = args.VIAF
	wsdata["ws-WORLDCAT"] = args.WORLDCAT
	wsdata["ws-WORLDCATch"] = args.WORLDCATch
	wsdata["ws-WORLDCATID"] = args.WORLDCATID
	wsdata["ws-XXX"] = args.XXX
--]]	
	{base = "SELIBR",	_id = "SELIBR",	_wsid = "ws-SELIBR",		_sauf = "", _space = "Auteur", _type = "Auteur",
		text = "Bibliothèque royale (Suède)",
		wptx = "Biblioth%%C3%%A8que_royale_%%28Su%%C3%%A8de%%29",
		_link="http://libris.kb.se/auth/REF_0"},
	{base = "SUDOC",	_id = "SUDOC",		_wsid = "ws-SUDOC",		_sauf = "", _space = "", _type = "Auteur",
		text = "Système universitaire de documentation",
		wptx = "Syst%%C3%%A8me%%20universitaire%%20de%%20documentation",
		_link="http://www.idref.fr/REF_0"},
	{base = "SWD",	_id = "SWD",			_wsid = "ws-SWD",		_sauf = "", _space = "", _type = "Auteur",
		text = "Schlagwortnormdatei",
		wptx = "Schlagwortnormdatei",
		_link="http://d-nb.info/gnd/REF_0"},
	{base = "ULAN",	_id = "ULAN",       _wsid = "ws-ULAN",			_sauf = "", _space = "", _type = "Auteur",
		text = "Union List of Artist Names",
		wptx = "Union%%20List%%20of%%20Artist%%20Names",
		_link="http://www.worldcat.org/oclc/REF_0"},
	{base = "VIAF",	_id = "VIAF",       _wsid = "ws-VIAF",			_sauf = "", _space = "", _type = "Auteur",
		text = "Fichier d'autorité international virtuel",
		wptx = "Fichier%%20d%%27autorit%%C3%%A9%%20international%%20virtuel",
		_link="http://viaf.org/viaf/REF_0"},
	{base = "WORLDCAT",	_id = "WORLDCAT",   _wsid = "ws-WORLDCAT",	_sauf = "", _space = "", _type = "",
		text = "WorldCat",
		wptx = "WorldCat",
		_link="http://www.worldcat.org/search?qt=worldcat_org_all&q=REF_2+REF_1"},
	{base = "WORLDCAT",	_id = "WORLDCATch", _wsid = "ws-WORLDCATch",_sauf = "", _space = "", _type = "",
		text = "WorldCat",
		wptx = "WorldCat",
		_link="http://www.worldcat.org/search?q=REF_2-REF_1&qt=owc_search"},
	{base = "WORLDCAT",	_id = "WORLDCATID", _wsid = "ws-WORLDCATID",_sauf = "", _space = "", _type = "Auteur",
		text = "WorldCat",
		wptx = "WorldCat",
		_link="http://www.worldcat.org/identities/REF_0"},
	-- Pour tests futurs sans perturber les notices réelles
	{base = "XXX",	_id = "XXXid",        _wsid = "ws-XXX",			_sauf = "", _space = "", _type = "Auteur",
		text = "XXX autorité",
		wptx = "XXX%%20autorit%%C3%%A9",
		_link="http://catalogue.bnf.fr/ark:/12148/REF_0"}
} -- notices_properties table								ws-OCLC ws-PND ws-ISNI SELIBR SWD VIAF WORLDCATch

--[[
boite deroulante pour module interactif ?
<a id="NavToggle3" class="NavToggle" href="javascript:toggleNavigationBar(3);">[Dérouler]</a>
--]]

-- {{Nota | BNF | {{{BNF | cb11888266r }}} | BNF | http://catalogue.bnf.fr/ark:/12148/{{{BNF|cb11888266r}}} | espace=Auteur }}
local HTMLnotice = function(control, data, ref, noticeN)
	-- Generer le wikitexte d'une notice selon ref, "id", "sauf", et l'espace de nom
	-- exemple : notice(control, data, "cb11888266r", noticeN)
	if nil == noticeN then return "" end
	local id = noticeN._id
	if nil == id then return "" end
	if nil == ref then ref = "" end
	local wptx = toUTF8(noticeN.text)
	-- wikitext structure
	-- [[File:Farm-Fresh draw calligraphic.png|22px|link=http://lccn.loc.gov/cb11888266r|BNF : cb11888266r]]
	local wt = '<span style="margin-left:10px;" > &nbsp; * &nbsp; [link_1 title_1] : [[File:Farm-Fresh draw calligraphic.png|22px|link=link_2|a_l_t]]</span>'
	-- title1="ARCid"
	wt = string.gsub(wt, "title_1", '' .. id)
	-- link1="http://fr.wikipedia.org/wiki/Biblioth%C3%A8que_nationale_de_France"
	wt = string.gsub(wt, "link_1", 'http://fr.wikipedia.org/wiki/' .. noticeN.wptx)
	-- title2="BNF : cb11888266r"
	wt = string.gsub(wt, "title_2", id .. " : " .. ref)
	-- link2="http://catalogue.bnf.fr/ark:/12148/cb11888266r"
	wt = string.gsub(wt, "link_2", noticeN._link)
	-- alt="BNF  : cb11888266r"
	wt = string.gsub(wt, "a_l_t", id .. " : " .. ref)
	-- Remplacer ref dans link
	wt = string.gsub(wt, "REF_0", ref)
	-- Remplacer des parties de ref dans link
	local N = 1
	-- ref = "ref1/ref2/ref3" comme "123/456/789" ou "Dubois/Angèle/Marie"
	for refN in string.gmatch(ref, "[^/]") do
		-- lire les portions de textes séparées par un /, ainsi [^/] selectionne tous les caracteres sauf /,
		if refN ~= ref then -- si on trouve des portions de ref
			wt = string.gsub(wt, "REF_" .. tostring(N), refN) -- on les remplace dans wt
		end
		N = N + 1
	end
	return wt
end -- HTMLnotice = function(control, data, ref, noticeN)

--	{base = "ARC",      _id = "ARCid",      _wsid = "ws-ARCid",		_sauf = "", _space = "", _type = "Auteur",
--		text = "National Archives and Records Administration",
--		wptx = "National Archives and Records Administration",
--		_link="http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},

local noticeSelect = function(control, data) -- , id, sauf)
	-- noticeList(control, data, "ARCorg", "", "", "cb11888266r", "http://catalogue.bnf.fr/ark:/12148/REF_0")
	-- notice(control, data, id, sauf, ref, space, "ARCorg", "", "http://catalogue.bnf.fr/ark:/12148/REF_0")
	-- notice(control, data, id, sauf, ref, space, "ARC", "ARCid", "http://catalogue.bnf.fr/ark:/12148/REF_0")
	-- local notice = function(control, data, id, sauf, ref, space, _id, _sauf, _space, _link)
	local t = "" -- "<br/>* noticeSelect:" .. tostring(id) .. " : "
	for noticeN in table_iterator(notices_properties) do
		-- pour toutes les notices connues de ce module
		-- collecter les parametres de la notice
		local id = noticeN._id -- id de la notice comme "ARC"
		local ws_id = noticeN._wsid -- ws de la notice comme "ws-ARC"
		local ref_id = Argts.argv(id) -- ref de la notice comme "cb11888266r"
		local space_id = noticeN._space -- espace de nom de la notice comme "Portail" ou "Auteur"
		if (type(space_id) ~= "string") then space_id = "" end -- si non defini space_id = ""
		local _type = noticeN._type -- type de la notice "Auteur" ou "Book" autre
		-- collecter les parametres d'une autre notice prioritaire
		local id_sauf = noticeN._sauf -- comme "ARCid"
		local ref_sauf = Argts.argv("ws-" .. id_sauf) -- comme "35096649" ref d'une autre notice prioritaire
		-- collecter les parametres de sélection
		local space = "_NAMESPACE_" -- espace de nom actuel comme "Portail" ou "Auteur"
		-- t = t .. ", " .. tostring(id) .. "=" .. tostring(idat) .. ":" .. space_id
		-- selectionner les notices à générer
		if (nil ~= ref_id) then -- exclure la notice si elle n'est pas demandée
			-- t = t .. HTMLnotice(control, data, ref_id, noticeN)
			if (nil == ref_sauf) then -- exclure la notice si une autre est prioritaire et définie
				if ("Auteur" == _type) then -- inclure les notices de type Auteur
					if (space_id ~= "") then -- si la notice est liée à un space de nom
						if (space_id == space) then -- inclure la notice seulement dans son espace de nom
							t = t .. HTMLnotice(control, data, ref_id, noticeN)
						end
					else -- inclure les notices non liées à un space de nom
						t = t .. HTMLnotice(control, data, ref_id, noticeN)
					end
				end
			end
		end
		-- Générer l'affichage de la notice
		-- t = t .. ", " .. tostring(_id) .. ":" .. tostring(wsid) .. "=" .. tostring(idat)
	end
	return '<span> &nbsp; - &nbsp; ' .. Trad.txt('author_Notices') .. ' : ' .. t .. '</span>'
end -- noticeSelect = function(control, data)
--	{base = "ARC",      _id = "ARCid",      _wsid = "ws-ARCid",			_sauf = "", _space = "",
--		text = "National Archives and Records Administration",
--		_link="http://arcweb.archives.gov/arc/action/ExternalPersonIdSearch?id=REF_0"},

local scanNames = function(wt, data)
	-- wt = scanNames("http://gallic ... &q=-ws-name-+-ws-firstname-", md_data) -- replace names for scans
	-- anti errors
--	local name = tostring(data["ws-name"])
	local name = Argts.argv("lastname")
	if nil == name then name = "" end
	local firstname = tostring(Argts.argv("firstname"))
	if nil == firstname then firstname = "" end
	local firstgall = firstname
	if nil ~= Argts.argv("Galliname") then
		firstgall = tostring(Argts.argv("Galliname"))
	end
	-- replace names for scans
	wt = tostring(wt)
	wt = tostring(string.gsub(wt, "ws_firstname", firstname) )
	wt = tostring(string.gsub(wt, "ws_name", name) )
	wt = tostring(string.gsub(wt, "ws_firstgall", firstgall) )
	return wt
end

local HTMLscans = function(args, data)
	-- wt = scanNames("http://gallic ... &q=-ws-name-+-ws-firstname-", md_data) -- replace names for scans
	-- anti errors
	-- Generate scans to display
	local SCAN__gallica = "<span> &nbsp; [http://gallica.bnf.fr/Search?ArianeWireIndex=index&p=1&lang=FR&q=ws_name+ws_firstname Gallica] </span>"
	SCAN__gallica = tostring(scanNames(SCAN__gallica, data) )
	local SCAN__europeana = "<span> &nbsp; [http://www.europeana.eu/portal/search.html?query=who:ws_name,%20ws_firstname&qf=LANGUAGE:fr&qf=LANGUAGE:mul&qf=TYPE:TEXT Europeana] </span>"
	SCAN__europeana = tostring(scanNames(SCAN__europeana, data) )
	local SCAN__google = "<span> &nbsp; [https://www.google.fr/search?q=inauthor%3A%22ws_firstname+ws_name%22&ie=utf-8&oe=utf-8&aq=t Google] </span>"
	SCAN__google = tostring(scanNames(SCAN__google, data) )
	local scan_notices = noticeSelect(args, data)
	local xxx = args_trad['author_Scans']
	local yyy = Trad.txt('author_Scans')
	local scans = '<div id="Author" class="vcard" style=" background-color:#F1F1DE; border:0px solid #CCCCCC; "><span>' .. Trad.txt('author_Scans') .. ' : &nbsp; ' .. SCAN__gallica .. SCAN__europeana .. SCAN__google .. scan_notices .. ' </span></div>'
	return scans
end
	-- Trad['fr']author_Scans				= 'Scans fr : ', author_Scans

local droits = function(now, args, data)
	local ri = Argts.argv("rights")
	local deathdate = tonumber(Argts.argv("deathyear"))
	local nowyear = tonumber(now.year)
	if "mpf" == ri then
		if nil == deathdate then
			return ""
		elseif nowyear < deathdate + 96 then
			return Argts.argv("fr-rights-warning-template")
		else
			return ""
		end
	elseif "non" ~= ri then
		local birthdate = tonumber(Argts.argv("birthyear"))
		if nil == deathdate then
			return ""
		elseif nowyear < deathdate + 71 then
			return Argts.argv("rights-warning-template")
		elseif nil == birthdate then
			return ""
		elseif 1903 > birthdate then
			return Argts.argv("rights-warning-template")
		else
			return ""
		end
	else
		return ""
	end
end
 
local catGen = function(catspace, catName, catText) -- generate category
	-- catGen("Category", "Naissance en 1948", "texte affiché") -> [[:Category:Naissance 1948|Naissance 1948]] 
	if nil == catspace then return "" end
	if nil == catName then return "" end
	if (type(catText) == 'string') and (catText ~= '')
		then catText = "|" .. catText
		else catText = '' end
	return "[[" .. catView .. catspace .. ":" .. catName .. catText .. "]]"
end

local catGroup = function(catspace, groupCat, groupList) -- generate some catagories
	-- catGroup(control, "Pays %1", "France/Italie") -> [[Category:Pays France]] [[Category:Pays Italie]] 
	if nil == catspace then return "" end
	if nil == groupCat then return "" end
	if nil == groupList then return "" end
	local cats = string.gsub(groupList, "[^/]+", "[[" .. catView .. catspace .. ":" .. groupCat .. "]] ")
	cats = string.gsub(cats, "/", "")
	return cats
end

local categories = function(control, data)
	--	category_space = frame:preprocess("{{ns:Category}}") -- Category namespace from system, par init
	local catspace = category_space
	local cats = {}
	local initiale = Argts.argv("initiale")
	local sans = tostring(Argts.argv("authors-category-no-initials") )
	catView = Argts.argv("c")
	trck(" categories() initiale=" .. initiale .. " sans=" .. sans .. " catView=" .. catView)
--	if catView == "x:" then catView = ":" end
	if catView ~= ":" then catView = "" end
	if type(initiale) == "string" then
	--	table.insert(cats, catGen(catspace, Argts.argv("authors-category-prefix") .. initiale ) )
		table.insert(cats, catGen(catspace, author_space .. initiale ) )
		trck( Argts.argv("authors-category-prefix") .. initiale )
	elseif (sans ~= "string") and (sans ~= "") then
		table.insert(cats, catGen(catspace, sans ) )
	end
	trck(" interwiki-category-linked-prefix ")
	local wikipedia = Argts.argv("wikipedia")
	local wikiquote = Argts.argv("wikiquote")
	local commons = Argts.argv("commons")
	local commonscat = Argts.argv("commons-category")
	if nil ~= wikipedia then table.insert(cats, catGen(catspace, "Wikipedia") ) end
	if nil ~= wikiquote then table.insert(cats, catGen(catspace, "Wikiquote") ) end
	if nil ~= commons then table.insert(cats, catGen(catspace, "Wikimedia Commons") ) end
	if nil ~= commonscat then table.insert(cats, catGen(catspace, "Wikimedia Commons category") ) end
	trck(" birthyear=" .. Argts.argv("birthyear") .. " occupation=" .. Argts.argv("occupation") .. " Wikipedia=" .. Argts.argv("Wikipedia"))
	trck( "Naissance en " .. Argts.argv("birthyear") )
--	if option("fr") then
	table.insert(cats, catGroup(catspace, "Naissance en %1", Argts.argv("birthyear") ) )
	table.insert(cats, catGroup(catspace, "Mort en %1", Argts.argv("deathyear") ) )
--	end
	-- catGroup(control, "Pays %1", "France/Italie/Grèce")
	-- |genre=Romanciers/Poètes/Auteurs de théatre
	table.insert(cats, catGroup(catspace, "%1", Argts.argv("genre") ) )
	-- |langue=français/japonais
	table.insert(cats, catGroup(catspace, "Langue %1", Argts.argv("language") ) )
	-- |metier=Académiciens/Personnalités politiques
	table.insert(cats, catGroup(catspace, "%1", Argts.argv("occupation") ) )
	-- |pays=France/Italie/Grèce
	table.insert(cats, catGroup(catspace, "Pays %1", Argts.argv("country") ) )
	-- |prix=Nobel de littérature/Pulitzer/Renaudot
	table.insert(cats, catGroup(catspace, "Prix %1", Argts.argv("prize") ) )
--	table.insert(cats, catGen(catspace, Argts.argv("authors-category") ) )
--	table.insert(cats, catGen(catspace, "Birth in %1", Argts.argv("birthyear") ) )
--	table.insert(cats, catGen(catspace, "Death in %1", Argts.argv("deathyear") ) )
	return table.concat(cats)
end -- categories = function(control, data)

local annotations = {}
annotations["lastname"] = "fn"
annotations["firstname"] = "n"
annotations["description"] = "label"
annotations["birthyear"] = "bday"
annotations["deathyear"] = "dday"
 
local microformat = function(data)
	if data ~= " cette instruction desactive microformat pour debug. " then return "" end
	local text = {}
	local style = "display:none; speak:none;"
	for n,v in pairs(data) do
		local class = annotations[n]
		local datum = mw.text.tag({name="span", contents=v, params={id=n,class=class}})
		table.insert(text, datum)
	end
	return mw.text.tag({name="div", contents=table.concat(text), params={id="ws-data", class="vcard ws-noexport", style=style}})
end
 
local defaultsort = function(control, data)
	local key = tostring(Argts.argv("sortkey"))
	local name = tostring(Argts.argv("lastname"))
	local given = tostring(Argts.argv("givenname"))
	local family = tostring(Argts.argv("lastname"))
	local name = key or name or ((given or "_") .. "," .. (family or ""))
	-- local name = data["ws-key"] or data["ws-name"] or ((data["given-name"] or "_") .. "," .. (data["family-name"] or ""))
	return mw.getCurrentFrame():preprocess("{{DEFAULTSORT:" .. name .. "}}")
	-- return "{{DEFAULTSORT:" .. name .. "}}"
end

-- Too basic english version, do not use
local headbox = function(control, data)
    local name = Argts.argv("sortkey") or Argts.argv("lastname") or ((Argts.argv("givenname") or "_") .. "," .. (Argts.argv("lastname") or ""))
	local wikipedia = Argts.argv("wikipedia")
	local wikiquote = Argts.argv("wikiquote")
	local commons = Argts.argv("commons")
	local commonscat = Argts.argv("commons-category")
    local interwikis = {}
	if nil ~= wikipedia then table.insert(interwikis, "* [[:wikipedia:" .. wikipedia .. "|" .. "Wikipedia]]\n") end
	if nil ~= wikiquote then table.insert(interwikis, "* [[:wikiquote:" .. wikiquote .. "|" .. "Wikiquote]]\n") end
	if nil ~= commons then table.insert(interwikis, "* [[:commons:" .. commons .. "|" .. "Wikimedia Commons]]\n") end
	if nil ~= commonscat then table.insert(interwikis, "* [[:commons:Category:" .. commonscat .. "|" .. "Wikimedia Commons category]]\n") end
	local links = "\n" .. table.concat(interwikis)
	local desc = "'''" .. name .. "'''\n"
	if Argts.argv("description") then
		desc = desc .. "\n" .. Argts.argv("description")
	end
	local image
	if Argts.argv("image") then
		local caption = Argts.argv("image-caption") or ""
		image = "[[File:" .. Argts.argv("image") .. "|125px|" .. caption .. "]]"
	else
		image = ""
	end
	-- FIXME: The styles, column widths, and CSS classes need adjusting.
	return "{| class=\"wikitable\" width=\"100%\"\n|-" .. name .. "\n|-\n|" .. links .. "\n|" .. desc .. "\n|" .. image .. "\n|}\n"
end

-- French version
local headbox_fr = function(args, data)
    -- Generate the main box, in HTML
	local title = Argts.argv("title") -- or Argts.argv("lastname") or Argts.argv("sortkey") or Argts.argv("givenname")
	if type(title) ~= "string" then title = "-" end
	local desc = ""
	if Argts.argv("description") then
		desc = desc .. "\n" .. Argts.argv("description")
	end
	if type(desc) ~= "string" then desc = "" end
	local image
	if Argts.argv("image") then
		local caption = Argts.argv("image-caption") or ""
		-- image = "[[File:" .. data["ws-image"] .. "|125px|" .. caption .. "]]"
		image = "[[File:" .. Argts.argv("image") .. "|frameless|170x170px||class=photo]]"
	else
		image = ""
	end
	if type(image) ~= "string" then image = "" end
	local initiale = Argts.argv("initiale")
	if type(initiale) ~= "string" then initiale = "" end
	-- <br/><span style="color:#aaaa66; line-height:120%; ">\<\<</span>&nbsp;[[:Catégorie:Auteurs-{{{initiale|H}}}|Auteurs&nbsp;{{{initiale|H}}}]]<br /><br />
	--
	-- Generate interwikis links
	local interwikis = {}
	if nil ~= initiale then table.insert(interwikis, '<br/><span style="color:#aaaa66; line-height:120%; ">◀ </span>&nbsp;[[' .. catView .. category_space .. ':' .. author_space .. '-' .. initiale .. '|' .. author_space .. '-' .. initiale .. ']]<br/><br/>') end
	-- Failed to encode the character ◀=(U+25C0) '<<' (U+25C4) at column 73 in line 60
	-- string.gfind(ustring, "([%z\1-\127\194-\244][\128-\191]*)")
	--	if nil ~= data.wikisource then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>[[wikisource:' .. control["namespace-author"] .. ':' .. data.wikisource .. '|Fac-similés]]<br/>') end
	if nil ~= Argts.argv("wikisource") then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>[[wikisource:' .. author_space .. ':' .. Argts.argv("wikisource") .. '|Fac-similés]]<br/>') end
	if nil == Argts.argv("wikipedia") then Argts["wikipedia"]["val"] = title end
	
	if Argts.argv("wikipedia") ~= "" then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>[[wp:' .. Argts.argv("wikipedia") .. '|Biographie]]<br/>') end
--	if Argts.argv("wikipedia") ~= "" then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>' .. catGen(arg_lang .. ":wikipedia:" .. category_space, Argts.argv("wikipedia"), "BiographieXYZ") .. '<br/>') end
	
--	catGen(arg_lang .. ":wikipedia:" .. category_space, Argts.argv("wikipedia"), "Biographie")
--	catGen("Category", "Naissance en 1948", "texte affiché")
	
	if nil == Argts.argv("wikiquote") then Argts["wikiquote"]["val"] = title end
	if nil ~= Argts.argv("wikiquote") then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>[[wikiquote:' .. Argts.argv("wikiquote") .. '|Citations]]<br/>') end
	if nil == Argts.argv("commons") then Argts["commons"]["val"] = title end
	if nil ~= Argts.argv("commons") then table.insert(interwikis, '<span style="color:#232388; font-size:140%; line-height:120%; ">⦁&nbsp;&nbsp;</span>[[commons:' .. Argts.argv("commons") .. '|Médias]]<br/>') end
	-- ◄ Auteurs H •  Fac-similés WS •  Biographie WP •  Citations WQ •  Médias WM
	-- if nil ~= data.wikipedia then table.insert(interwikis, "* [[:w:" .. data.wikipedia .. "|" .. "Wikipedia]]\n") end
	-- if nil ~= data.wikiquote then table.insert(interwikis, "* [[:q:" .. data.wikiquote .. "|" .. "Wikiquote]]\n") end
	-- if nil ~= data.commons then table.insert(interwikis, "* [[:commons:" .. data.commons .. "|" .. "Wikimedia  Commons]]\n") end
	-- if nil ~= data.commonscat then table.insert(interwikis, "* [[:commons:Category:" .. data.commonscat .. "|" .. "Wikimedia Commons category]]\n") end
	local links = "\n" .. table.concat(interwikis)
	--
	-- FIXME: The styles, column widths, and CSS classes need adjusting.
	-- FIXME: The french display is in HTML direct to better adapt the size and the look to plural environments.
	--
	-- Generate scans to display
	local scans = HTMLscans(args, data)
	--
	-- Generate wikitext to display
	local wt = '<div id="Author" class="vcard" style="margin-right:5px; box-shadow:0.2em 0.3em 0.2em #B7B7B7; background-color:#F1F1DE; padding:0.3em; width=99.9%; overflow-x:hidden; ">'
	  .. '<table cellspacing="0" cellpadding="0" style="background-color: transparent; border:{{{border|1}}}px solid #CCCCCC; padding:0em;">'
		.. '<tr>'
		  .. '<td valign="middle" rowspan="2" style="padding: 0em 0.6em; background-color: #F1F1DE; text-align:left; font-size:90%; line-height:80%; ">'
			.. '<div style="text-align:left; font-size:120%; padding-top:0.5em; text-indent:1em">'
			  .. links
			.. '</div>'
		  .. '</td>'
		  .. '<td valign="top" align="center" style=" min-width:150px; border-left:{{{border|1}}}px solid #CCCCCC; padding:0.5em; ">'
			.. '<span class="fn" id="AuthorName" style="line-height:90%; font-size:160%; font-weight:bold; padding-top:0.1em; border-bottom: none; ">'
			  .. title
			.. '</span>'
		  .. '</td>'
		  .. '<td valign="middle" align="center" rowspan="2" style=" border-left:{{{border|1}}}px solid #CCCCCC; ">'
			.. '<div id="AuthorImage" style=" padding:4px; ">'
			  .. image
			.. '</div>'
		  .. '</td>'
		.. '</tr>'
		.. '<tr>'
		  .. '<td valign="top" align="center" style="width:100%; border-left:{{{border|1}}}px solid #CCCCCC; padding:1em; ">'
			.. '<span class="label" style=" font-size:110%; line-height:80%; text-align:center; " >'
			  .. desc
			.. '</span>'
		  .. '</td>'
		.. '</tr>'
		.. '<tr>'
		  .. '<td valign="top" align="center" colspan="3" style="width:100%; border-top:{{{border|1}}}px solid #CCCCCC; padding:1em; ">'
			.. '<span class="label" style=" font-size:110%; line-height:80%; text-align:center; " >'
			  .. scans
			.. '</span>'
		  .. '</td>'
		.. '</tr>'
	  .. '</table>'
	.. '</div>'
	return wt
	--   "{| class=\"wikitable\" width=\"100%\"\n|-" .. name .. "\n|-\n|" .. links .. "\n|" .. desc .. "\n|" .. image .. "\n|}\n"
end -- headbox_fr = function(args, data)
 
-- Générer la liste des notices.
local notices_liste = function(notices_properties, args)
	-- notices_liste(notices_properties, args)
	if type(notices_properties) ~= "table" then return "" end
	if type(args) ~= "table" then return "" end
	local t = "<br/>Paramètres de notices d'autorités connues du module : "
	for noticeN in table_iterator(notices_properties) do
		-- pour toutes les notices connues de ce module
		-- collecter les parametres de la notice
		local id = noticeN._id -- id de la notice comme "ARC"
		local wsid = noticeN._wsid -- ws-id de la notice comme "ws-ARC"
		t = t .. id .. "-"
		if Argts[wsid] == nil then
		--	erreur_add("err_internal_notice_wsid", tostring(wsid))
		else
			local _type = noticeN._type -- type de la notice "Auteur" ou "Book" ou autre
			t = t .. ", " .. tostring(wsid) .. "=" .. tostring(id) .. ":" .. _type
			if _type == "Auteur" then
				Argts[wsid]["val"] = args[id] -- lire les paramètres de notices de type Auteur
				t = t .. "+"
			end
		end
	end
	t = t .. "Fin des notices."
	trck( t )
	return t
end -- local notices_liste = function(notices_properties, args)

-- local unitestScribunto = require "Module:Unitest_Scribunto"

-- [[ -- Module:Unitest_Scribunto start

--[[
	Example of result :
* Init of unit tests. test_list = table
* Begin of unit tests :
* 1 Site tested : mw.uri.fullUrl = //fr.wikisource.org/wiki/Module:Auteur.
* 2 Environment : Mediawiki 1.21wmf10 (d6c6dba) version UTC 2013-03-01 21:53:59.
* 3 Runtime and spaces : server UTC 2013-03-04 01:09:22, namespace=Modèle module_space=Module, template_space=Modèle viewErrors=true.
* 4 frame.args Error : frame.args.lastname = "error". The OK value was "OK" = frame:getParent().args.lastname.
* 5 sub table write Test OK : sub table write OK. / / / result OKOK  ; exec_ok=true ; value_ok=true ; var_tested=td.C.X ; value_before=xx ; value_after=okvalue ; A=aa ; Y=yy .
* 6 Is Scribunto complete ? Error : Scribunto is not complete. / / /  ; math=table ; os=table ; package=table ; string=table ; table=table ; mw=table ; frame=table ; mw.language=table ; mw.message=nil ; mw.site=table ; mw.title=nil ; mw.uri=table ; mw.ustring=table .
* End of unit tests. Statistic count : Nerr=2 / Ntests=6
--]]

--[[
Unitest_Scribunto like/from Scribunto_LuaEngineTestBase
http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Test_cases
class ClassNameTest extends Scribunto_LuaEngineTestBase {
	protected static $moduleName = 'ClassNameTest';
	
	function getTestModules() {
		return parent::getTestModules() + array(
			'ClassNameTest' => __DIR__ . 'ClassNameTests.lua';
		);
	}
}
local testframework = require 'Module:TestFramework'
return testframework.getTestProvider( {
	-- Tests go here
} )
Each test is itself a table, with the following properties:
    name: The name of the test.
    func: The function to execute.
    args: Optional table of arguments to pass to the function.
    expect: Results to expect.
    type: Optional "type" of the test, default is "Normal".

local function AuteurTestCurrentNamespace(space) {
	-- This repair a Lua bug : {{NAMESPACE}} give nothing in fr.wikisource.org
	current_space = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
--	This repair a Lua bug : mw.site.namespaces.name is unknown
	module_space = frame:preprocess("{{ns:Module}}") -- Module namespace from system
	template_space = frame:preprocess("{{ns:Template}}") -- Module namespace from system
	author_space = frame:preprocess("{{ns:Author}}") -- Author namespace from system
	category_space = frame:preprocess("{{ns:Category}}") -- Category namespace from system
	if current_space == space then
	end
	return space .. "OK"
}

class ClassAuteurTest extends Scribunto_LuaEngineTestBase {
	protected static $moduleName = 'ClassAuteurTest';
	function getTestModules() {
		return parent::getTestModules() + array(
			'ClassAuteurTest' => __DIR__ . 'ClassAuteurTest.lua';
		);
	}
}

--]]

local formatdate = function(date_time)
	-- formatime(date_time)
	-- formate "20130302153557" en "2013-03-02 15:35:57"
	date_time = tostring(date_time.year) .. "-" .. tostring(date_time.month) .. "-" .. tostring(date_time.day) .. " " .. tostring(date_time.hour) .. ":" .. tostring(date_time.min) .. ":" .. tostring(date_time.sec)
	return date_time
end -- local formatdate = function(date_time)

local formatime = function(date_time)
	-- formatime(date_time)
	-- formate "20130302153557" en "2013-03-02 15:35:57"
	date_time = tostring(date_time)
	date_time = string.sub(date_time, 1, 4) .. "-" .. string.sub(date_time, 5, 6) .. "-" .. string.sub(date_time, 7, 8) .. " " .. string.sub(date_time, 9, 10) .. ":" .. string.sub( date_time, 11, 12) .. ":" .. string.sub(date_time, 13, 14)
	return date_time
end -- local formatime = function(date_time)

local function if_exist(ok, wt, mw_uri, mw_uri_name)
	-- ok, wt = if_exist(ok, wt, mw.uri, 'mw.uri')
	local isnil = tostring(mw_uri)
	local t = mw_uri_name .. '=' .. isnil
	if isnil == "nil" then -- Y a-t-il erreur de valeur ?
		ok = false -- Il y a une erreur de valeur
		wt = wt .. ' ; <span style="color:red;" >' .. t .. '</span>'
	else
		ok = ok -- Il n'y a pas d'erreur de valeur
		wt = wt .. ' ; ' .. t
	end
	return ok, wt
end

local sub_table_write_data = {
	A = "aa",
	B = "bb",
	C = {
		X = "xx",
		Y = "yy"
	}
}

local function sub_table_write_function(td)
	-- test d'ecriture dans une sous table
	local A = td.A
	local Y = td.C.Y
	local var_tested = "td.C.X"
	local value_before = td.C.X
	local value_after = value_before
	td.C.X = "okvalue" -- INSTRUCTION UNDER TEST
	value_after = td.C.X -- verifier aussi l'ecriture puis lecture
	local value_ok = ( value_after == "okvalue" )
	return value_ok, var_tested, value_before, value_after, A, Y
end

-- Series of unit tests. Série de tests unitaires.
-- require 'Module:TestFramework'
-- similar to : class ClassNameTest extends Scribunto_LuaEngineTestBase {
local tst = { 
	
	test_frame = nil, -- frame
	
	test_result = "",

	test_list = {
		-- Tests go here
	},

} -- tst object like Scribunto_LuaEngineTestBase

local Unitest_Scribunto_tested_site = { name = "Tested site",
	func_test = function(parm, frame)
	-- Get environment
		local ok, out_OK, out_HS = true, parm.expect, "error"
		local t = ""
		local mw_uri_fullUrl = mw.uri.fullUrl('Module:Auteur') --  "Module:Auteur" )
		t = t .. ": mw.uri.fullUrl = " .. tostring(mw_uri_fullUrl)
--		local mw_uri = mw.uri.new('Module:Auteur') --  "Module:Auteur" )
		-- mw.uri.new( s )
	--	local mw_title = mw.title.new('Module:Auteur') --  "Module:Auteur" )
--		t = t .. ": mw.uri.prefixedText = " .. tostring(mw_uri.prefixedText)
	-- futur : mw.title.new( 'Module:Foo', 'Template' ) will create an object for the page Module:Foo
	-- mw.title.makeTitle( 'Template', 'Module:Foo' ) will create an object for the page Template:Module:Foo.
	-- mw.title   object :
	-- nsText: The text of the namespace for the page.
	-- prefixedText: The title of the page, with the namespace and interwiki prefixes.
	-- fullText: The title of the page, with the namespace and interwiki prefixes and the fragment.
	
	--	local preprocess_url = frame:preprocess("{{fullurl:Module:Auteur}}")
	--	t = t .. "<br/> preprocess_url = " .. tostring(preprocess_url)
		out_OK = t
		out_HS = t
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = "_N_TEST_ <b>_PRM_NM_</b> _OUT_OK_.",
	iferr = '_N_TEST_ <b>_PRM_NM_</b> _OUT_HS_.</span>',
}

local Unitest_Scribunto_environment = { name = "Environment",
	func_test = function(parm, frame)
	-- Get environment
		local ok, out_OK, out_HS = true, parm.expect, "error"
		local t = ""
		local date_time = frame:preprocess("{{#dateformat:{{CURRENTTIMESTAMP}}|ymd}}")
		local now_date = os.date("%Y-%m-%d %H:%M:%S")
		local mw_version = frame:preprocess("{{CURRENTVERSION}}")
		local revision_time = frame:preprocess("{{REVISIONTIMESTAMP}}")
		local dtnow, dtvers = now_date, revision_time
		-- dtnow = formatime(now_date)
		dtvers = formatime(dtvers)
		t = t .. ": Mediawiki " .. tostring(mw_version) .. " version UTC " .. tostring(dtvers)
	--	t = t .. " read by { {CURRENTVERSION} }"
		out_OK = t
		out_HS = t
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = "_N_TEST_ <b>_PRM_NM_</b> _OUT_OK_.",
	iferr = '_N_TEST_ <b>_PRM_NM_</b> _OUT_HS_.</span>',
}

local Unitest_Scribunto_runtime_spaces = { name = "Runtime and spaces",
	func_test = function(parm, frame)
		local ok, out_OK, out_HS = true, parm.expect, "error"
		local now_date = os.date("%Y-%m-%d %H:%M:%S")
		local namespace = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
		local module_space = frame:preprocess("{{ns:Module}}") -- Module namespace from system
		local template_space = frame:preprocess("{{ns:Template}}") -- Module namespace from system
		local viewErrors = (namespace == module_space) or (namespace == template_space)
		local t = ""
		t = t .. ": server UTC " .. tostring(now_date) .. ", namespace=" .. tostring(namespace)
		t = t .. " module_space=" .. tostring(module_space) .. ", template_space=" .. tostring(template_space)
		t = t .. " viewErrors=" .. tostring(viewErrors)
--[[
		current_space = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
		-- mw.site.namespaces.name is unknown
		module_space = frame:preprocess("{{ns:Module}}") -- Module namespace from system
		template_space = frame:preprocess("{{ns:Template}}") -- Module namespace from system
		author_space = frame:preprocess("{{ns:Author}}") -- Author namespace from system
		category_space = frame:preprocess("{{ns:Category}}") -- Category namespace from system
		local current_space = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
		local REVISIONUSER = frame:preprocess("{{REVISIONUSER}}") -- current user when previewing an edit
		local ns_Module = frame:preprocess("{{ns:Module}}") -- {{ns:User}} namespace translated
		local ns_Template = frame:preprocess("{{ns:Template}}") -- {{ns:User}} namespace translated
		local int_edit = frame:preprocess("{{int:edit}}") -- {{int:edit}} → Edit, translate "edit"
		local language_ar = frame:preprocess("{{#language:ar}}") -- full name of the language
		-- {{FULLPAGENAMEE}} {{PAGENAMEE}} {{BASEPAGENAMEE}} {{SUBPAGENAMEE}}
		-- {{SUBJECTPAGENAMEE}} {{ARTICLEPAGENAMEE}} {{TALKPAGENAMEE}}
		local ARTICLEPAGENAMEE = frame:preprocess("{{ARTICLEPAGENAMEE}}")
		local date_time = frame:preprocess("{{#dateformat:{{CURRENTTIMESTAMP}}|ymd}}")
		local mw_version = frame:preprocess("{{CURRENTVERSION}}")
		local revision_time = frame:preprocess("{{REVISIONTIMESTAMP}}")
		local now_date = os.date("%Y-%m-%d %H:%M:%S")
	--	local date_time = frame:preprocess("{{#dateformat:{{CURRENTTIMESTAMP}}|ymd}}")
	--	local mw_version = frame:preprocess("{{CURRENTVERSION}}")
	--	local revision_time = frame:preprocess("{{REVISIONTIMESTAMP}}")
	--	local dtnow, dtvers = now_date, revision_time
	--	dtnow = formatime(dtnow)
	--	dtvers = formatime(dtvers)
	--	t = t .. " read by { {CURRENTTIMESTAMP} }"
--]]
		out_OK = t
		out_HS = t
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = "_N_TEST_ <b>_PRM_NM_</b> _OUT_OK_.",
	iferr = '_N_TEST_ <b>_PRM_NM_</b> _OUT_HS_.</span>',
}

local Unitest_Scribunto_frame_args = { name = "frame.args",
	func_test = function(parm, frame)
		-- * frame:getParent().args.lastname = Rimbaud
		-- * frame.args.lastname = nil
		local ok, out_OK, out_HS = true, parm.expect, "error"
		local frame_args = frame.args
		local getParent_args = frame:getParent().args
		local arglingual = tostring(args_trad.lastname) -- multilingual name of the arg
		local frame_val = tostring(frame_args[arglingual])
		local getParent_val = tostring(getParent_args[arglingual])
		local t = "* <b>" .. tostring(parm.name) .. "</b> "
		local ok, out_REF, out_TEST = true, "", ""
		out_REF = tostring(getParent_val)
		out_TEST = tostring(frame_val)
		if out_TEST == out_REF then -- OK
			ok = true
		else -- HS bug
			ok = false
		end
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = '_N_TEST_ <b>_PRM_NM_</b> Test OK : frame.args.lastname = "_OUT_HS_".',
	iferr = '_N_TEST_ <b>_PRM_NM_</b> <span style="color:red;" >Error : frame.args.lastname = "_OUT_HS_". The OK value was "_OUT_OK_" = frame:getParent().args.lastname.</span>',
}

local Unitest_Scribunto_sub_table_write = { name = "sub table write",
	func_test = function(parm, frame)
		-- * Test sub table read OK : Test cx : td.C.X = cx, expected = cx, test OK.
		-- * Test sub table write HS : Test x : tst.test_data.C.X = new val -> error
		-- pcall( func, args ) -- return { true, func() } or return { false, error message }
		-- how to read cousins in table, like cd ..other branch
		local ok, out_OK, out_HS = true, parm.expect, "error"
	--	local td_C_X_read = td.C.X
		-- Run a protected call to detect the execution error
		local exec_ok, value_ok, var_tested, value_before, value_after, A, Y = pcall( sub_table_write_function, sub_table_write_data )
		local outest = " ; exec_ok=" .. tostring(exec_ok) .. " ; value_ok=" .. tostring(value_ok) .. " ; var_tested=" .. tostring(var_tested) .. " ; value_before=" .. tostring(value_before) .. " ; value_after=" .. tostring(value_after) .. " ; A=" .. tostring(A) .. " ; Y=" .. tostring(Y)
		if exec_ok then -- OK
			ok = true -- Il n'y a pas d'erreur d'execution
			out_OK = " result OK-- " .. outest
			if value_ok then -- Y a-t-il erreur de valeur ?
				ok = true -- Il n'y a pas d'erreur de valeur
				out_OK = " result OKOK " .. outest
			else -- HS bug
				ok = false -- Il y a une erreur de valeur
				out_HS = " result OKHS " .. outest
			end
		else -- HS bug
			ok = false -- ll y a une erreur d'execution
			out_HS = " result HS-- " .. outest
		end
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = '_N_TEST_ <b>_PRM_NM_</b> Test OK : sub table write OK. / / / _OUT_OK_ .',
	iferr = '_N_TEST_ <b>_PRM_NM_</b> <span style="color:red;" >Error : sub table write HS. / / /  _OUT_HS_ .</span>',
}

local Unitest_Scribunto_complete = { name = "Is Scribunto complete ?",
	func_test = function(parm, frame)
		-- * Test sub table read OK : Test cx : td.C.X = cx, expected = cx, test OK.
		-- * Test sub table write HS : Test x : tst.test_data.C.X = new val -> error
		-- pcall( func, args ) -- return { true, func() } or return { false, error message }
		-- how to read cousins in table, like cd ..other branch
		local ok, out_OK, out_HS = true, parm.expect, "error"
	--	local td_C_X_read = td.C.X
		-- Run a protected call to detect the execution error
		local exec_ok, value_ok, var_tested, value_before, value_after, A, Y = pcall( sub_table_write_function, sub_table_write_data )
		local outest = " ; exec_ok=" .. tostring(exec_ok) .. " ; value_ok=" .. tostring(value_ok) .. " ; var_tested=" .. tostring(var_tested) .. " ; value_before=" .. tostring(value_before) .. " ; value_after=" .. tostring(value_after) .. " ; A=" .. tostring(A) .. " ; Y=" .. tostring(Y)
		local ok, wt = true, ''
		ok, wt = if_exist(ok, wt, math, 		'math')
		ok, wt = if_exist(ok, wt, os, 			'os')
		ok, wt = if_exist(ok, wt, package, 		'package')
		ok, wt = if_exist(ok, wt, string, 		'string')
		ok, wt = if_exist(ok, wt, table, 		'table')
		ok, wt = if_exist(ok, wt, mw, 			'mw')
		ok, wt = if_exist(ok, wt, frame, 		'frame')
		ok, wt = if_exist(ok, wt, mw.language, 	'mw.language')
		ok, wt = if_exist(ok, wt, mw.message, 	'mw.message')
		ok, wt = if_exist(ok, wt, mw.site, 		'mw.site')
		ok, wt = if_exist(ok, wt, mw.title, 	'mw.title')
		ok, wt = if_exist(ok, wt, mw.uri, 		'mw.uri')
		ok, wt = if_exist(ok, wt, mw.ustring, 	'mw.ustring')
		out_OK = wt
		out_HS = wt
		return ok, tostring(out_OK), tostring(out_HS)
	end,
	args = {"x"},
	expect = "OK",
	type = "ToString",
	ifok = '_N_TEST_ <b>_PRM_NM_</b> Test OK : sub table write OK. / / / _OUT_OK_ .',
	iferr = '_N_TEST_ <b>_PRM_NM_</b> <span style="color:red;" >Error : Scribunto is not complete.</span> / / /  _OUT_HS_ .',
}

function tst.init( frame, test_list, test_data )
	-- tst.init(frame, tst.test_list)
	--	tst.test_list is the default value
	if type(frame) == "table" then tst.test_frame = frame end
	if type(test_list) == "table" then tst.test_list = test_list end
	table.insert( tst.test_list, Unitest_Scribunto_tested_site )
	table.insert( tst.test_list, Unitest_Scribunto_environment )
	table.insert( tst.test_list, Unitest_Scribunto_runtime_spaces )
	table.insert( tst.test_list, Unitest_Scribunto_frame_args )
	table.insert( tst.test_list, Unitest_Scribunto_sub_table_write )
	table.insert( tst.test_list, Unitest_Scribunto_complete )
	if type(test_data) == "table" then tst.test_data = test_data end
	local t = "<br/>* Init of unit tests. test_list = " .. tostring( tst.test_list ) .. "<br/>"
	tst.test_result = tst.test_result .. t
    return t
end -- function tst.init( frame, test_list, test_data )

function tst.run_all_tests( frame )
    local input_args = frame.args.input or frame.args
	local result = ""
	local wt, t = "", "* Begin of unit tests :<br/>"
	local n, nerr = 0, 0
	local ok, out_OK, out_HS = true, "", ""
	for key, parm in pairs(tst.test_list) do -- Pour tous les parametres connus
		n = n + 1
		wt = ""
		if parm.type == "ToString" then -- args en ordre numerique et renvoi vers un argument nommé
			ok, out_OK, out_HS = parm.func_test(parm, frame)
			-- pcall( func, args ) -- return { true, func() } or return { false, error message }
		--	t = t .. '* ' .. tostring(n) .. ' <b>' .. tostring(parm.name) .. '</b> result =' .. tostring(result) .. ' '
			if ok then -- si le test est OK
				wt = parm.ifok
				--	t = t .. ' ' .. parm.ifok .. '</span>' .. out_OK .. '<br/>'
			else -- si le test est HS
				wt = parm.iferr
				--	t = t .. '<span style="color:red;" >' .. parm.iferr .. '</span>' .. out_HS .. '<br/>'
				nerr = nerr + 1
			end
			wt = string.gsub(wt, "_PRM_NM_", tostring(parm.name) )
			wt = string.gsub(wt, "_N_TEST_", tostring(n) )
			wt = string.gsub(wt, "_N_ERR_", tostring(nerr) )
			wt = string.gsub(wt, "_OUT_OK_", tostring(out_OK) )
			wt = string.gsub(wt, "_OUT_HS_", tostring(out_HS) )
		--	t = t .. '* ' .. tostring(n) .. ' <b>' .. tostring(parm.name) .. '</b> ' .. wt
			t = t .. '* '.. wt .. "<br/>"
		end
	end
	t = t .. "* End of unit tests. Statistic count : Nerr=" .. tostring( nerr ) .. " / Ntests=" .. tostring( n ) .. "<br/>"
	tst.test_result = tst.test_result .. t
    return tst.test_result
end -- function tst.run_all_tests( frame )
-- end of tst object

--]] -- Module:Unitest_Scribunto end

local function AuteurTestRun(frame)
	-- if ifBug == nil then return AuteurTestRun()
	local t = "<br/>AuteurTestRun : list of cases :<br/>"
	local current_space = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
	-- Run a standard test of Lua in scribunto
	local t = "<br/>AuteurTestRun : <b>frame.args</b> or frame:getParent().args ? :<br/>"
	local mw_version = frame:preprocess("{{CURRENTVERSION}}")
	local revision_time = frame:preprocess("{{REVISIONTIMESTAMP}}")
	-- local date_time = frame:preprocess("{{CURRENTTIMESTAMP}}")
	local date_time = frame:preprocess("{{#dateformat:{{CURRENTTIMESTAMP}}|ymd}}")
	local frame_args = frame.args
	local getParent_args = frame:getParent().args
	local arglingual = tostring(args_trad.lastname) -- multilingual name of the arg in the template
	-- Get environment
	t = t .. "* Get environment :<br/>"
	t = t .. ".....* 20130228 18:40 LTC CURRENTVERSION MediaWiki 1.21wmf10 (52304ce) read by http://fr.wikisource.org/wiki/Sp%C3%A9cial:Version <br/>"
	t = t .. ".....* 20130228 18:40 LTC CURRENTVERSION Mediawiki 1.21wmf10 (72462da) read by {{CURRENTVERSION}} <br/>"
	t = t .. ".....* Mediawiki " .. tostring(mw_version) .. " from UTC = " .. tostring(revision_time) .. "<br/>"
	t = t .. ".....* test run UTC = " .. tostring(date_time) .. "<br/>"
	t = t .. ".....* frame:getParent().args = " .. tostring(getParent_args) .. "<br/>"
	t = t .. ".....* frame.args = " .. tostring(frame_args) .. "<br/>"
	local argval = tostring(getParent_args[arglingual])
	t = t .. ".....* frame:getParent().args.lastname = " .. tostring(argval) .. "<br/>"
	local argval = tostring(frame_args[arglingual])
	t = t .. ".....* frame.args.lastname = " .. tostring(argval) .. "<br/>"
	-- Test simple table read
	local cx = tst.test_data.C.X
	t = t .. "* Test <b>simple table read OK</b> :<br/>"
	t = t .. ".....* Test aa : td.A = " .. tst.test_data.A .. ", expected =a a, test OK.<br/>"
	t = t .. "* Test <b>sub table read OK</b> :<br/>"
	t = t .. ".....* Test cx : td.C.X = " .. tst.test_data.C.X .. ", expected = cx, test OK.<br/>"
	-- Test sub table write
	-- in some cases sub table can not be write. which ones ?
	tst.test_data.C.X = 'xx'
	t = t .. "* Test <b>sub table write OK</b> :<br/>"
	t = t .. ".....* Test x : tst.test_data.C.X = " .. tst.test_data.C.X .. ", expected = x, test OK.<br/>"
	t = t .. ".....* Test t : tst.txt('t') = " .. tst.txt('t') .. ", expected = t, test OK.<br/>"
	tst.test_result = tst.test_result .. t
	return t
end

-- Interface http://scribunto.wmflabs.org/
local p = {}

-- Interface pour générer une entête de page d'auteur.
function p.auteur(frame)
	trck_on = option("track")
--	local args = frame.args
--	28/02/2013 This repair Lua bug : args = frame.args is a table but without arguments
	local args = frame:getParent().args -- local pframe
	local now = { year = args.year, month = args.month, day = args.day } -- UTC ?
--	local prm = Argts.new() -- create a new object from the class Argts, to update later
	local prm = Argts -- arguments connus, known arguments
--	current_space = " ns=" .. mw.site.namespaces.name -- {{NAMESPACE}}
--	current_space = " ns0=" .. frame:preprocess("{{ns:0}}") -- present namespace from system
--	This repair a Lua bug : {{NAMESPACE}} give nothing in fr.wikisource.org
	current_space = frame:preprocess("{{NAMESPACE}}") -- present namespace from system
--	This repair a Lua bug : mw.site.namespaces.name is unknown
	module_space = frame:preprocess("{{ns:Module}}") -- Module namespace from system
	template_space = frame:preprocess("{{ns:Template}}") -- Module namespace from system
	author_space = frame:preprocess("{{ns:Author}}") -- Author namespace from system
	category_space = frame:preprocess("{{ns:Category}}") -- Category namespace from system
	prm.args_init(prm.args_known_default, args)
--	prm.args_init(nil, args, "fr")
	-- local Argtest = { options = " debug fr docavant ", "Rimbaud", "Arthur", "1234", droits = "70", pays = "France" }
	if ArgXXXtest ~= nil then
		local t = prm.args_import_all(Argtest) -- Argts.args_import_all(args_src, args_kwn)
		t = t..Argts.generDoc("") -- Documentation des arguments dés leur lecture
		return t
	end
--[[
	-- Interact parameters
	-- |nom=Hugo|prénom=Victor|prénomGall= Arthur
	-- The syntax var.Name is just syntactic sugar for var["Name"]
	local lastname = args.nom
	local last_initial = args.initiale
	if "!NO_INITIALS" == last_initial then last_initial = nil end
	local firstname = args["prénom"] or last_initial
	if nil ~= lastname then
		if firstname ~= nil then
			title = firstname .. " " .. lastname
		else
			title = lastname
		end
	end
	wsdata["lastname"] = lastname
	wsdata["ws-firstname"] = firstname
	wsdata["ws-initial"] = last_initial
	wsdata["ws-title"] = title
	wsdata["family-name"] = lastname
	wsdata["given-name"] = firstname
	
	local wsdata = {}
	
	local param_type = "<br/>Paramètres de notices d'autorités connues du module : "
	for noticeN in table_iterator(notices_properties) do
		-- pour toutes les notices connues de ce module
		-- collecter les parametres de la notice, voir docnotice
		local id = noticeN._id -- id de la notice comme "ARC"
		local wsid = noticeN._wsid -- ws-id de la notice comme "ws-ARC"
		if Argts[wsid] == nil then
		--	erreur_add("err_internal_notice_wsid", tostring(wsid))
		else
			local _type = noticeN._type -- type de la notice "Auteur" ou "Book" ou autre
			param_type = param_type .. ", " .. tostring(wsid) .. "=" .. tostring(id) .. ":" .. _type
			if _type == "Auteur" then
				Argts[wsid]["val"] = args[id] -- lire les paramètres de notices de type Auteur
				param_type = param_type .. "+"
			end
		end
	end
--]]

	prm.args_import_all(args) -- args : import all arguments from template, or other source
	local_options = options_change(local_options, Argts.args_known_default["options"]["val"], "init")
	doc_args_import_all = Argts.generDoc("") -- Documentation des arguments dés leur lecture
	trck('<br/>* ')
	local argval =  prm.argv("birthdate") -- read arg value from local data
	trck('<br/>* ')
	local argval =  prm.argv("deathdate") -- read arg value from local data
--	local_options = options_change(local_options, Argts.argv("options", tr), "init")
	--
	-- Interact parameters
	local lastname = prm.argv("lastname")
	local firstname = prm.argv("firstname")
	local Galliname = prm.argv("Galliname")
	local pseudonym = prm.argv("pseudonym")
	local sortkey = prm.argv("sortkey")
	local familyname = prm.argv("familyname")
	local title = prm.argv("title")
	local initiale = prm.argv("initiale")
	lastname = lastname or pseudonym or sortkey or familyname or initiale
	if title == "" then
		if lastname ~= "" then
			if firstname == "" then
				title = lastname
			else
				title = firstname .. " " .. lastname
			end
	--		elseif Galliname ~= "" then
	--			title = Galliname .. " " .. lastname
		end
	end
	-- if there is no firstname, try to extract it from lastname
	-- ...
	-- link to other wikis
	local wikipedia = prm.argv("wikipedia")
	local wikiquote = prm.argv("wikiquote")
	local commons = prm.argv("commons")
	if wikipedia == "" then wikipedia = title end
	if wikiquote == "" then wikiquote = title end
	if commons == "" then commons = title end
	-- title = firstname .. " " .. lastname
	prm.arg_memorize("lastname", lastname)
	prm.arg_memorize("firstname", firstname)
	prm.arg_memorize("title", title)
	prm.arg_memorize("wikipedia", wikipedia)
	prm.arg_memorize("wikiquote", wikiquote)
	prm.arg_memorize("commons", commons)
	--
	-- Generer des tests et documentations optionnels avant le wikitexte normal
    local unitest = ""
    if option("unitest") then
    	tst.init(frame) -- tst.init( frame, test_list, test_data )
    	tst.run_all_tests( frame )
    	unitest = tst.test_result
    end
	local docavant = ""
	if option("docavant") then
		docavant = doc_args_import_all
	end
	local errs = ""
	if option("erreurs") then errs = erreur_lister() end
	-- docavant = Argts.generDoc("")
	--
	-- Generer le wikitext et HTML normal, categories et autres (sauf options contraires)
	local box = headbox_fr(args, wsdata)
	if option("nobox") then box = "" end
	local cat = categories(control, wsdata)
    if option("nocat") then cat = "" end
	local dat = microformat(wsdata)
	local drs = droits(now, control, wsdata)
	local ds = defaultsort(control, wsdata)
    --
	-- Generer des tests et documentations optionnels après le wikitexte normal
	local doc_notice = ""
    if option("docnotice") then doc_notice = notices_liste(notices_properties, args) end
	local docapres = ""
	if option("docapres") then
		docapres = doc_args_import_all
	end
	local track = ""
	if trck_on then track = trc end
--	if option("track") then track = trc end
--		errs = erreur_lister("<br/>Erreurs pendant l'affichage initial de l'entète d'auteur :")
--		errs = '<span style="color:red;" >' .. errs .. '</span>'
--	end
	return unitest .. docavant .. errs .. box .. cat .. dat .. drs .. ds .. doc_notice .. docapres .. track .. '<br/>'
end -- p.auteur(frame)

-- Alias pour Interface pour générer une entête de page d'auteur.
function p.fr(frame)
	return p.auteur(frame)
end -- p.fr(frame)

-- Interface pour générer une notice d'autorité indépendante sur une personne, un livre ou autre.
function p.notice(frame)
--	local pframe = frame:getParent()
--	local args = pframe.args
	local args = frame.args
	local now = { year = args.year, month = args.month, day = args.day }
	-- local prm = Argts.new() -- create a new object from the class Argts
	local prm = Argts -- arguments connus, known arguments
	category_space = frame:preprocess("{{ns:Category}}") -- Category namespace from system
	author_space = frame:preprocess("{{ns:Author}}") -- Category namespace from system
	prm.args_init(prm.args_known_default, args, "fr")
	-- local Argtest = { options = " debug fr docavant ", "Rimbaud", "Arthur", "1234", droits = "70", pays = "France" }
	if ArgXXXtest ~= nil then
		local t = prm.args_import_all(Argtest) -- Argts.args_import_all(args_src, args_kwn)
		t = t..Argts.generDoc("") -- Documentation des arguments dés leur lecture
		return t
	end
	arg_lang = "en"
	-- Generate wikitext and others
	local ntc = HTMLnotice(control, data, ref, noticeN)
	return ntc
end -- p.notice(frame)

-- Alias pour Interface pour générer une notice d'autorité indépendante sur une personne, un livre ou autre.
function p.nt(frame)
	return p.notice(frame)
end -- p.nt(frame)

return p