Module:IgenCoa



From Wikimedia Commons, the free media repository



Jump to navigation  Jump to search  

Lua

CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

Deutsch: Im Normalfall muss sich der Benutzer nicht mit diesem Modul auseinandersetzen;

WWWes arbeitet im Hintergrund und erleichtert seine Arbeit, indem es Parameter sinnvoll ergänzt.
WWWNur in Einzelfällen wird es notwendig, diese vor dem Zurückschreiben zu modifizieren.

WWWEs muss jedoch der komplette String eingegeben werden, falls ohne das Modul gearbeitet wird!
English: Normally the user has nothing to do with this module, it works in the background,

WWWwhere it generates a useful parameter_string, which can be modified when necessary.

WWWBut the complete string as here described has to be composed when working without that module!

This module enables simplification when Template:COAInformation is used.

It is intended to generate the parameters for 0| image =0

For test purposes it can be invoked from other templates, and return to another template.

It is also possible to be invoked from files with Information-description, via the adapter template Igenc.

Be aware that the parameters need to be separated by slashes "/" and not by pipes "|"


The parameter is one string containing all the sub-parameters.


Therefore neither the pipe character, nor the equal sign can be used within this string.

These characters, when needed, had to be replaced: pipes by slashes, equal signs by tildes.

Usage

{{IgenCoa |1= }}

"Usage" above, and "Template parameters" below are nonsense in this case. See instead Module usage.

Module parameters

Template parameters

ParameterDescriptionDefaultStatus
1The only required parameter specifies

   ■ either a complete {{Igen|.....}} definition, with all the tags, in curly brackets with pipes
   ■ or a tool name (e.g. I, Im, Ic; A, AH, IA)

   ■ or a short code for a user entry (e.g. TK for User:TomKr), case-insensitive
emptyrequired
2possible W3C error count0 (valid)optional
3topic for the file, e.g. c, ce, eh (or something else)0coptional
4shortcode for a national graphic lab, e.g. gd, ge, gf (or something else)emptyoptional
5validation style, e.g. florno (or something else)emptyoptional
gc ~can specify or suppress a subcategory within the graphic lab, e.g. ":TomKr" (with :)emptyoptional
sd ~can specify or suppress a Graphic Lab subcategory differentiationemptyoptional
U ~can specify or suppress a user for the text (with link) — oremptyoptional
u ~can specify or suppress a user for the text (without link) (see description)emptyoptional
su ~

sub: ~

can specify or suppress a subcategory within
"Valid SVG created with ..." or "Invalid SVG created with ..."
emptyoptional
ca ~

cat2 ~

can specify or suppress an additional category,
either with [[Category:Xxxx]] or just the name Xxxx
emptyoptional
more parametersneed to be specified in the format name ~ value (instead of name = value)

All Image generation-specified parameters can be passed, using the name~value notation:
replacements are needed: for pipes slashes, for equal signs tildes,
00 for slashes backslashes (or broken pipes), for spaces understrokes (or).
When a parameter value is itself a template transclusion, within its curly brackets all

characters, including equal signs, pipes and slashes, are allowed.
emptyoptional

Additional information

The template is intended to be used in the following namespaces: the File namespace

The template is intended to be used by the following user groups: all users

See also

Template:{{COAInformation}}, Template:{{Image generation}}, Category:CoA Lab;
Template:IgencIgen/coa: with Igenc predefined keys can be used even for files with Information instead of COAInformation

Module usage

{{ #invoke:IgenCoa | main | parameter_string }}


Normally the user has nothing to do with this module, it works in the background.

The script will generate a useful parameter_string for {{COAInformation}}; but it can be modified when necessary.

The format is | image = parameter_string; it can be either a complete {{Igen|....}} clause, or slash-separated parameters.

An example: |image = {{Image generation|Im|6|+|gf|s=eh}} stands for :

Equivalent are |image = Im/6/eh/gf and |image = Fe/6/tool~Im, which shows the two main cases:

parameter 1 is the code for either a tool (like Inkscape), or the table key for the table of predefined user options.


Every single parameter can be modified, all parameters can be added, and each value transfer from the table can be excluded with the value -.

Examples:
To add the tag % for embedded text, add /%
To add the tag ~ for PGF data, add /~;
to specify the user causing that, add /~~username (the first ~ is the tag, the second ~ is for the =)

Any other tag or parameter for {{Image generation}} can be specified this mode, positionals just preceded by a slash,

named parameters with slash + name + tilde + value.

Spaces don't care, /g~it is equal to / g ~ it.

Replacements:
For needed spaces pass the understroke _ (or the character , U+2194 double arrow).
For needed slash use the backslash \ (or the broken bar ¦)
For needed backslash use the inverted exclamation ¡
User name:

For {{Igen}} the uppercase "U" and the lowercase "u" are mutually exclusive, U has precedence when both are specified.
By this module a "u" in the usertable is overwritten by a "U" in the usertable (therefore it has no sense to predefine both);
an input "u~" overwrites all values from the usertable, and an input "U~" overwrites (or suppresses) everything.
Note: A "u~" is just text, it is not necessarily a valid user name. It can be wikicode, as e.g. [[User:name|display]]


Table expansion:

This is mere technical information for people wanting to chance entries, or to add new ones.

to distinguish, "c" is often used for charges (elements). and "e" for ecclesiasticals.
when less than 11 are needed, further nil filling is not necessary after the last value.
But some codes are reserved pseudo keys, e.g. for tools like "I", or for labs like "fi" for "fr" individuell.
g_lab coa element eccles. indiv. catonly
g_d d dc de di dx
g_e e ec ee ei ex
g_f f fc fe fi fx

These national wikipedias have projects which are linked standardwise, while the CoA Lab (parm 4) is linked "individuell":

Wp Coa Lab Project
de di dw = Wappenwerkstatt
es ei ge = THV
fr fi gf = Projet Blasons
pl [ Pi ] gP = WPGW vector image

The catonly option avoids the invocation of the Graphic Lab but categorizes to it, without the icon box.

Most predefinitions are for SVG files; raster images are drawn with often unknown tools.

All usernames and their keys must be also defined in the cleanup script.

For raster graphics, user keys of 2 characters become internally appended with an "r":
when userkey e.g. Ab is for SVG files, internal userkey Abr is for raster images;
the cleanup script needs only one userkey for a user, for both SVG and not-SVG; it can detect whether
it is a raster file, and an element ('charge'), but only the user can see if it's an ecclesiastical coa.

It is very irritating that the topics used by Igen differ completely from the keys used in this table.

While for the topics the "c" was expanded to ce for "coaelement", and eh for "eccelsiastical heraldry",
the table has to allow that one user may draw as well coa and elements and eccelsiasticals.
The user key "Uu" may get expanded with "c" for charges, or "e" for ecclesisatical, or "r" for raster images.
usage coa element eccles. raster
Igen topic c ce eh
table key Uu Uuc Uue Uur

With modification, the Igen topic is the third parameter, e.g. |image = Uu//eh

Search mode: The search key may consist of two or three characters.

another search is performed with this key reduced to two characters.
the key is expanded with rorc and another search is performed with this key.

A user may have up to four keys, the 2-character key and its expansions with coreorr

Treatment for Coats of Arms, elements and ecclesiasticals

Besides the "normal" CoAs are there also elements used for drawing vector image CoA, and the group of CoAs used by religious leaders of the Roman Catholic Church.

Another differentiation exists for bitmap (raster image) CoAs.

These groups exist

  • when the key for |image is this Uuc key, it is used.
  • when the key for |image is just Uu, the Uuc key is searched and used, when found.
It should be modified with topic ce, and probaly other parameters (tool);
Otherwise the element is treated as a standard SVG CoA.
  • when the key for |image is this Uur key, it is used.
  • when the key for |image is just Uu, the Uur key is searched and used, when found.
  • when the key for |image is just Uu and no Uur key exists, it should be modified.
BMP elements are rare

With modifictions, all different groups can be processed with one userkey. But the automatic treatment is only possible when each group has an own key predefined, e.g. Uuc, Uue, Uur.

Table of the predefinitions

{{#invoke:IgenCoa|distab}} (sorted by key: first all the user keys, then the pseudo keys)

Table display
#keytoolertoplabgcsdUusubcat
1adIcgf:Adalric67ADAdalric67
2agIcgi:ANGELUSAGANGELUS
3ahIcnl:AtHoekAHA. ter Hoek
4aiIAcgf:AubisseAIAubisse
5akIscgH:ARKAKARK
6alIcHi:AlimanALAliman5040
7anIcge:AnenjaANAnenjaContribuciones de Anenja
8aoIIcgi:AshoppioAO
9arIcgf:ArocheARAroche
10asIcASArchmedus
11auIcgf:AupsAUAups
12avIcgp:Aviz2000AVAviz2000
13awIcgf/ch:AiweAWAiwe
14b1IcB1B1mbo
15baIcgP:BastianowBABastianow
16bbrUncgp:Brian BoruBBBrian Boru
17beIcgf:Bear17BEBear17
18bgIcgc:BalmungBGBalmung0731
19biIcgf:BibarBIBibar
20blIcgf:BluebearBLBluebear2
21bnF8cgH:BerninaBNBernina
22boDcBoBrCaLeTo
23brIcbr:BriegBRBrieg
24btIcgf:BinnetteBTBinnette
25bvIcgf:Bvs-acaBVbvs-aca
26byIcgf:BizcayenBYBizcayen
27bzIcgf:BenzebuBZBenzebuth198
28c1AcC1COAmaker17
29c2DcsuC2Care
30cbIcgf:CelbusroCBCelbusro
31ccrUnehgp:CatChessCCCatChess
32chIcgf:ChatsamChatsamBlason chatsam
33chcIcegf:ChatsamChatsamBlason chatsam
34clIcCLCarlos yo
35cmDrawShieldceiCharles Matthews
36cnIcgf:CaranornCNCaranorn
37cpIehph:CPhoenixCP
38csIcdnnl:ChrisChris die SeeleCoA by Chris die Seele
39cvIcCVCsavil
40cyIcgf:CyygmaCYCyygma
41czIccs
42d9Im5cgf/ch:Delta-9D9Delta-9
43daIcnl:DArchDAD'ArchCoat of Arms by Arch
44ddIcgi:Dd..monnDDDdurbmonnejg
45dkUncgs:Dan KoehlDKDan KoehlCoats of arms by Dan Koehl
46dkrUncgs:Dan KoehlDKDan KoehlCoats of arms by Dan Koehl
47dlIcdi:D.S.LiuzzoDLDavid Liuzzo
48dtxIcdnDoc TaxonCoA by Doc Taxon
49dxrUncei:DomaleixoDODomaleixo
50ekrUncdi:EkpahEKEkpah
51emIcgi:EchandoEMEchando una mano
52enImcgB:EnekorgaENEnekorga
53epAcei:BoricuaEP
54erIocgeErlenmeyerContribuciones de Erlenmeyer
55esIzcgH:EspanderoESEspandero
56etIAcgf:EtxekoETEtxeko
57euIcgc:EuryrelEUEuryrel
58eueIehgc:EuryrelEUEuryrel
59f2Icdi:Flow2F2Flow2
60f5Icgf:F5JMHF5A.T-2015
61fjIcgf:FlyjackFJFlying jacket
62fmuUcFDFDRMRZUSA
63foIcsu:FennOFOFenn-O-maniC
64fqIcgi:FacquisFQFacquis
65frIcgH:FränsmerFRFränsmer
66fuIcgi:FulvioπFUFulvio314
67g2Icgi:Gb89.2G2Gb89.2
68gbIcgH:GerhardBGBGerhard Bräunlich
69gjIcgi:GJoGJGJo
70gkUcGKGeraldiker
71glIcdisx:GliwiGliwiCoA by Gliwi
72goIcGOGunnar.offel
73grIcgf:GretazGRGretaz
74gyIehph:G_YoshGY
75heIcei:HeralderHEHeralder
76hpIcgf:Honneur-PHPHonneur-Patrie
77hsIcgf:HSaloméHSℍenry Salomé
78ipIcgc:IpankoninIPIpankoninImages by Ipankonin
79iwIcgP:Isidor WIWIsidor Welti
80j2IcJ2James2813
81j9Icgf:Jean92J9Jean92 dit le Comte
82jcrUncbr:J.C EVENJCJ.C EVEN
83jkIcJürgen KrauseCoA by Jürgen KrauseCOA by User:Jürgen Krause
84jmIcgf:J-MahmoudJMJean-Mahmoud
85jnIcgf:Jimmy44Jimmy44Files by User:Jimmy from fr.wikipedia
86jneIehgf:Jimmy44Jimmy44Files by User:Jimmy from fr.wikipedia
87jpIcgf:JpgibertJpgibertCoA by JPGibert
88jpcIcegf:JpgibertJean-Paul GibertCoA by JPGibertProducts of jpgibert/heraldry/charge
89jpeIehgf:JpgibertJpgibertCoA by JPGibert
90jrIehph:J-RonnJRJ-Ronn
91jwUncgc:JwnabdJwnabdCoats of arms drawn by User:Jwnabd
92jwrUncgc:JwnabdJwnabdCoats of arms drawn by User:Jwnabd
93k2Icgf:KontributorK2Kontributor 2K
94keIcgi:KetipmaigKEKetipmaig
95kkrUncga:KKundlKKKontrollstellekundl
96l2DcL2Leonid 2
97l5rUncdi:Lothar520L5Lothar520
98laIcgi:LambertoLALamberto99
99lhrUncdi:LoschLHLosch
100lmIcgf:LeMorvandLMLeMorvandiau
101lpIcsx:Lokal_ProfilLPLokal_ProfilImages by Lokal_Profil/CoA
102luIcdi:Ludger1961LULudger1961
103lvDcgr:LobachevLVLobachev
104lyUncgi:LynxlynxLYLynxlynx
105lyrUncgi:LynxlynxLYLynxlynx
106maIcgf:ManassasMAManassas
107mbIcgh:MadboyMadboy74CoA by Madboy74
108mcIehei:MacucalMCMacucalUser:Macucal
109meIcgi:MostEpicMEMostEpic
110mgUncgP:MagulMGMagul
111mgrUncgP:MagulMGMagul
112miIcMilenioscuroCoats of arms by User:Milenioscuro
113mlIcdwno:MaxxLMaxxLCoA by MaxxL
114mmruncgi:MassimopMMMassimop
115mnIcge:MiguillenMNMiguillen
116mxIcdi:MaxwxyzMXMaxwxyz
117n7IcN7Nanin7
118neIcgf:NescdNENescd
119ngIcgc:Ng556NGNg556
120ngeIehgc:Ng556NGNg556
121npIcgp:NPortuguêsNPN.Português
122odBlenderncgf:OdejeaODOdejeaFiles by Odejea/PNG coat of arms
123odeIehgf:OdejeaOdejeaFiles by Odejea/SVG ecclesiastical coat of arms
124odrBlenderncgf:OdejeaODOdejeaFiles by Odejea/PNG coat of arms
125p4Acdi:Puck04P4Puck04
126p7Icfi:Peter17P7Peter17Images by Peter Potrowl
127pcImcgf:Pce13PCPce13
128phIcdi:PerhelionPHPerhelion
129piUnehgP:PiomPIPiomPictures by PioM
130pirUnehgP:PiomPIPiomPictures by PioM
131plIcgP
132pnIcdi:PhilnatePNPhilnate
133poAcgr:PopadiusPOPopadius
134r2IcR2RaFaDa20631
135raIcgP:RagimiriRARagimiri
136rcAcRCRegicollis
137rgrUncdi:RepgowRGRepgow
138rlUncRLRootOfAllLight
139rlrUncRLRootOfAllLight
140rnIcgf:RinaldumRNRinaldum
141rqIcRQRoqz
142rvIcgi:RuthvenRuthvenCoA by Ruthven
143rveIehgi:RuthvenRuthvenCoA by Ruthven
144s0Icgf:Spax89Spax89CoA by Spax89
145s1Icgf:Spax8989Spax89
146s7Icgf:SsireS7Ssire
147saIcSajoRCoA by SajoR
148saeIehSajoREscudos eclesiásticos de SajoR
149seIcdi:Simon.ESimon.ellerCoA by Simon Eller
150sfIcSFSrfortes
151sgImcgf:SanguinezSGSanguinez
152sgeImehgf:SanguinezSGSanguinez
153siAcgH:SidoniusSISidonius
154sjIcSJSsolbergj
155skIcflSteveKCoA by SteveKCOA by SteveK
156skwIcgdsxSteveKCOA by SteveK
157slAccgH:Spinner2SLSpinnerLaserzthe2nd
158smIcSMSamhanin
159snIcei:SeñorDLNSNElSeñorDeLaNoche
160soIcgl:SodacanSOSodacan
161spIcgf:SpedonaSPSpedona
162sqIcgeSQSanchoPanzaXXIGraphics by User:SanchoPanzaXXI
163srIcfx:SanglierTSRSanglierT
164sreIehfx:SanglierTSRSanglierT
165ssIcgH:Sandro S.SSSa-se
166stIcgf:Stella3STStella3
167suIcgs:C.SundinSUC.SundinImages by User:C.Sundin
168syPhotoshopncgf:SyryatsuSYSyryatsuBlason par Syryatsu
169syrPhotoshopncgf:SyryatsuSYSyryatsuBlason par Syryatsu
170taIcgH:TaktaalTATaktaal
171tfIccs:TFerenczyTFTFerenczy
172tkIcgf:TomKrTKTomKr
173tlIcgf:LanaudTLThom.Lanaud
174tluUcgf:LanaudTLThom.Lanaud
175toIcnl:Tom-LTOTom-L
176trUncdi:TRystauTRT. Rystau
177trrUncdi:TRystauTRT. Rystau
178tuUnehTUTomáš Urban
179turUnehTUTomáš Urban
180tvIcgf:TretinvilleTVTretinvilleBlasons Tretinville
181v1AcV1ViniciusBR11
182v9Uncgi:Vale93bVale93bCoA by Vale93bU:Vale93b
183v9hUnehgi:Vale93bVale93bCoA by Vale93bU:Vale93b
184v9rUncgi:Vale93bVale93bCoA by Vale93bU:Vale93b
185vaIcgf:B.ValletteVABruno
186vdIcgf:VddbertVDVddbert
187vdeIehgf:VddbertVDVddbert
188vorUncuk:VityOKMVOVity OKM
189waIcgf:Wagner51WAWagner51
190whTcdi:WalderichWHWalderich
191wkIcWKKaliforniyka
192xvIcge:XavigivaxXVXavigivax
193yrImcgf:YricordelYRYricordel
194zaIcgf:Zardoz91ZAZardoz91SVG coats of arms of France
195ziIcgf:ZigeunerZIZigeuner
196zoIcgf:ZorlotZOZorlot
==================
1aAc
2dIcgd
3dcIcegd
4deIehgd
5diIcdi
6dxUncei:DomaleixoDODomaleixo
7eIcge
8ecIcege
9eeIehge
10eiIcei
11exIcge
12fIcgf
13fcIcegf
14feIehgf
15fiIcfi
16fxIcgf
17gcIcgc
18hIcgH
19iIc
20iaIAc
21imImc
22itIcgi
23nlIcnl
24pbIcgf
25rieUneh
26rirUnc
27ruIcgr
28tT0c
29uUcgc:UU
==================
1zzzzUcgc:??substitute:


Code

local libraryUtil = require('libraryUtil') 

local p = {}  --

-- local function "user code table" for COAInformtion users, 
-- by the user short code ('uc') as table key
-- user short code may get an expansion "c" for charges, "e" for ecclesiasticals, "x" for raster images

 utab =
  { 
--- tools:  1    2    3 
   a = { 'A', nil, 'c' };   -- standard Adobe
   i = { 'I', nil, 'c' };   -- standard Inkscape
   ia = { 'IA',nil, 'c' };   -- Inkscape + Adobe
   im = { 'Im',nil, 'c' };   -- impotent Inkscape
 t   = { 'T', '0', 'c' };  -- Text editor
-- user:  1    2    3    4    5   gc sd   U,u su   ca
 ad = { 'I', nil, 'c', 'gf', nil,  ':Adalric67', 'AD', 'Adalric67' };
 ag = { 'I', nil, 'c', 'gi', nil,  ':ANGELUS', 'AG', 'ANGELUS' };
 ah = { 'I', nil, 'c', 'nl', nil,  ':AtHoek', 'AH', 'A. ter Hoek' };
 ai = { 'IA',nil, 'c', 'gf', nil,  ':Aubisse', 'AI', nil, '[[User:Aubisse~commonswiki|Aubisse]]' };
 al = { 'I', nil, 'c', 'Hi', nil,  ':Aliman', 'AL', 'Aliman5040' };
 an = { 'I', nil, 'c', 'ge', nil,  ':Anenja', 'AN', 'Anenja',nil, nil, 'Contribuciones de Anenja' };
 ak = { 'Is',nil, 'c', 'gH', nil,  ':ARK', 'AK', 'ARK' };
 ao = { 'II',nil, 'c', 'gi', nil,  ':Ashoppio', 'AO' };
 ar = { 'I', nil, 'c', 'gf', nil,  ':Aroche', 'AR', 'Aroche' };
 as = { 'I', nil, 'c',  nil, nil,  nil, 'AS', 'Archmedus' };
-- at = { 'I', nil, 'c', 'gP', nil,  nil, 'AT', 'Alex Tora' };   images afre too poor
 au  = { 'I', nil, 'c', 'gf', nil,  ':Aups', 'AU', 'Aups' };
 av = { 'I', nil, 'c', 'gp', nil,  ':Aviz2000', 'AV', 'Aviz2000' };
 aw = { 'I', nil, 'c', 'gf', nil,  '/ch:Aiwe', 'AW', 'Aiwe' };
 b1 = { 'I', nil, 'c',  nil, nil,  nil, 'B1', 'B1mbo' };
 ba = { 'I', nil, 'c', 'gP', nil,  ':Bastianow', 'BA', 'Bastianow' };
 bbr = { 'U', 'n', 'c', 'gp', nil,  ':Brian Boru', 'BB', 'Brian Boru' };
 be = { 'I', nil, 'c', 'gf', nil,  ':Bear17', 'BE', 'Bear17' };
 bg = { 'I', nil, 'c', 'gc', nil,  ':Balmung', 'BG', 'Balmung0731' };  -- Japanese
 bi = { 'I', nil, 'c', 'gf', nil,  ':Bibar', 'BI', 'Bibar' }; -- nil, '-Blasons' };
 bl = { 'I', nil, 'c', 'gf', nil,  ':Bluebear', 'BL', 'Bluebear2' };
 bn = { 'F', '8', 'c', 'gH', nil,  ':Bernina', 'BN', nil,'[[User:Bernina~commonswiki|Bernina]]' };
 bo = { 'D', nil, 'c',  nil, nil,  nil, 'Bo', 'BrCaLeTo' };
 br = { 'I', nil, 'c', 'br', nil,  ':Brieg', 'BR', 'Brieg' };
 bt = { 'I', nil, 'c', 'gf', nil,  ':Binnette', 'BT', 'Binnette' };
 bv = { 'I', nil, 'c', 'gf', nil,  ':Bvs-aca', 'BV', 'bvs-aca' };
 by = { 'I', nil, 'c', 'gf', nil,  ':Bizcayen', 'BY', 'Bizcayen' };
 bz = { 'I', nil, 'c', 'gf', nil,  ':Benzebu', 'BZ', nil,'Benzebuth198' };
 c1 = { 'A', nil, 'c',  nil, nil,  nil, 'C1', 'COAmaker17' };
 c2 = { 'D', nil, 'c', 'su', nil,  nil, 'C2', 'Care' };
-- c3 = { 'I', nil, 'c',  nil, nil,  nil, 'C3', 'Care  corel' };
 cb  = { 'I', nil, 'c', 'gf', nil,  ':Celbusro', 'CB', 'Celbusro' };
 ccr = { 'U', 'n', 'eh','gp', nil,  ':CatChess', 'CC', 'CatChess' };
 ch = { 'I', nil, 'c', 'gf', nil,  ':Chatsam', nil, 'Chatsam',nil, nil, 'Blason chatsam' };
 chc = { 'I', nil, 'ce','gf', nil,  ':Chatsam', nil, 'Chatsam',nil, nil, 'Blason chatsam' };
 cl = { 'I', nil, 'c',  nil, nil,  nil, 'CL', 'Carlos yo' };
 cm =  { 'DrawShield', nil, 'c', 'ei', nil,  nil, nil, 'Charles Matthews' }; 
 cn  = { 'I', nil, 'c', 'gf', nil,  ':Caranorn', 'CN', 'Caranorn' };
 cp  = { 'I', nil, 'eh','ph', nil,  ':CPhoenix', 'CP' };
 cs = { 'I', nil, 'c', 'dn','nl',  ':Chris', nil, 'Chris die Seele',nil, 'CoA by Chris die Seele' };
 cv = { 'I', nil, 'c',  nil, nil,  nil, 'CV', nil,'[[User:Christhoforos|Csavil]]' };
 cy = { 'I', nil, 'c', 'gf', nil,  ':Cyygma', 'CY', 'Cyygma' };
 d9 = { 'Im','5', 'c', 'gf', nil,  '/ch:Delta-9', 'D9', 'Delta-9' };
 da = { 'I', nil, 'c', 'nl', nil,  ':DArch', 'DA', "D'Arch",nil, nil, 'Coat of Arms by Arch'  };
 dd = { 'I', nil, 'c', 'gi', nil,  ':Dd..monn', 'DD', 'Ddurbmonnejg' };
 dk  = { 'T', '0', 'c', 'gs', nil,  ':Dan Koehl', 'DK', 'Sarang',nil, nil, 'Coats of arms by Dan Koehl'};
 dkr = { 'U', 'n', 'c', 'gs', nil,  ':Dan Koehl', 'DK', 'Dan Koehl',nil, nil, 'Coats of arms by Dan Koehl'};
 dl = { 'I', nil, 'c', 'di', nil,  ':D.S.Liuzzo', 'DL', 'David Liuzzo' };
 dtx = { 'I', nil, 'c', 'dn', nil,  nil, nil, 'Doc Taxon',nil, 'CoA by Doc Taxon'};
 dxr = { 'U', 'n', 'c', 'ei', nil,  ':Domaleixo', 'DO', 'Domaleixo' };
 ekr = { 'U', 'n', 'c', 'di', nil,  ':Ekpah', 'EK', 'Ekpah' };
 em = { 'I', nil, 'c', 'gi', nil,  ':Echando', 'EM',  nil,"''Echando una mano''" };  
 en = { 'Im',nil, 'c', 'gB', nil,  ':Enekorga', 'EN', 'Enekorga' };
 ep = { 'A', nil, 'c', 'ei', nil,  ':Boricua', 'EP' }; --   User:The Eloquent Peasant - also Adobe
 er = { 'Io',nil, 'c', 'ge', nil,  nil, nil, 'Erlenmeyer',nil, nil, 'Contribuciones de Erlenmeyer' };
 es = { 'Iz',nil, 'c', 'gH', nil,  ':Espandero', 'ES', 'Espandero' };
 et = { 'IA',nil, 'c', 'gf', nil,  ':Etxeko', 'ET', 'Etxeko' };
 eu = { 'I', nil, 'c', 'gc', nil,  ':Euryrel', 'EU', 'Euryrel' };
 eue = { 'I', nil, 'eh','gc', nil,  ':Euryrel', 'EU', 'Euryrel' };
 f2 = { 'I', nil, 'c', 'di', nil,  ':Flow2', 'F2', 'Flow2' };
 f5 = { 'I', nil, 'c', 'gf', nil,  ':F5JMH', 'F5', nil,'[[user:F5JMH|A.T-2015]]' };
 fj = { 'I', nil, 'c', 'gf', nil,  ':Flyjack', 'FJ', 'Flying jacket' };
 fmu = { 'U', nil, 'c',  nil, nil,  nil, 'FD', 'FDRMRZUSA' };
 fo = { 'I', nil, 'c', 'su', nil,  ':FennO', 'FO', 'Fenn-O-maniC' };
 fq = { 'I', nil, 'c', 'gi', nil,  ':Facquis', 'FQ', 'Facquis' };
 fr = { 'I', nil, 'c', 'gH', nil,  ':Fränsmer', 'FR', 'Fränsmer' };
 fu = { 'I', nil, 'c', 'gi', nil,  ':Fulvioπ', 'FU', 'Fulvio314' };
-- take care with g  -  some pseudo-keys ae reserved ! 
 g2 = { 'I', nil, 'c', 'gi', nil,  ':Gb89.2', 'G2', 'Gb89.2' };
 gb = { 'I', nil, 'c', 'gH', nil,  ':GerhardB', 'GB', 'Gerhard Bräunlich' };
 gj = { 'I', nil, 'c', 'gi', nil,  ':GJo', 'GJ', 'GJo' };
 gk = { 'U', nil, 'c',  nil, nil,  nil, 'GK', 'Geraldiker' }; 
 gl = { 'I', nil, 'c', 'di','sx',  ':Gliwi', nil, 'Gliwi',nil, 'CoA by Gliwi' };
 go = { 'I', nil, 'c',  nil, nil,  nil, 'GO', 'Gunnar.offel' }; 
 gr = { 'I', nil, 'c', 'gf', nil,  ':Gretaz', 'GR', 'Gretaz' };
 gy = { 'I', nil, 'eh','ph', nil,  ':G_Yosh', 'GY' };
 he = { 'I', nil, 'c', 'ei', nil,  ':Heralder', 'HE', 'Heralder' };
 hp = { 'I', nil, 'c', 'gf', nil,  ':Honneur-P', 'HP', 'Honneur-Patrie' };
 hs = { 'I', nil, 'c', 'gf', nil,  ':HSalomé', 'HS', nil,'[[User:Henrysalome|ℍenry Salomé]]' };
 ip  = { 'I', nil, 'c', 'gc', nil,  ':Ipankonin', 'IP', 'Ipankonin',nil, nil, 'Images by Ipankonin' };
 iw = { 'I', nil, 'c', 'gP', nil,  ':Isidor W', 'IW', 'Isidor Welti' }; 
 j2 = { 'I', nil, 'c',  nil, nil,  nil, 'J2', 'James2813' }; 
 jcr = { 'U', 'n', 'c', 'br', nil,  ':J.C EVEN', 'JC', 'J.C EVEN' }; 
 j9 = { 'I', nil, 'c', 'gf', nil,  ':Jean92', 'J9', 'Jean92 dit le Comte' };
 jk = { 'I', nil, 'c',  nil, nil,  nil, nil, 'Jürgen Krause',nil, 'CoA by Jürgen Krause', 'COA by User:Jürgen Krause' };
 jm = { 'I', nil, 'c', 'gf', nil,  ':J-Mahmoud', 'JM', 'Jean-Mahmoud' };
 jn = { 'I', nil, 'c', 'gf', nil,  ':Jimmy44', nil, 'Jimmy44',nil, nil, 'Files by User:Jimmy from fr.wikipedia' };
 jne = { 'I', nil, 'eh','gf', nil,  ':Jimmy44', nil, 'Jimmy44',nil, nil, 'Files by User:Jimmy from fr.wikipedia' };
 jp = { 'I', nil, 'c', 'gf', nil,  ':Jpgibert', nil, 'Jpgibert',nil, 'CoA by JPGibert' };
 jpc = { 'I', nil, 'ce','gf', nil,  ':Jpgibert', nil, nil,'[[User:Jpgibert|Jean-Paul Gibert]]', 'CoA by JPGibert', 'Products of jpgibert/heraldry/charge' };
 jpe = { 'I', nil, 'eh','gf', nil,  ':Jpgibert', nil, 'Jpgibert',nil, 'CoA by JPGibert' };
 jr  = { 'I', nil, 'eh','ph', nil,  ':J-Ronn', 'JR', 'J-Ronn' };
 jw = { 'T', nil, 'c', 'gc', nil,  ':Jwnabd', 'JW', 'Jwnabd',nil, nil, 'Coats of arms drawn by User:Jwnabd' };
 jwr = { 'U', 'n', 'c', 'gc', nil,  ':Jwnabd',  nil, 'Jwnabd',nil, nil, 'Coats of arms drawn by User:Jwnabd' };
 k2 = { 'I', nil, 'c', 'gf', nil,  ':Kontributor', 'K2', 'Kontributor 2K' };
 ke = { 'I', nil, 'c', 'gi', nil,  ':Ketipmaig', 'KE', 'Ketipmaig' }; 
 kkr = { 'U', 'n', 'c', 'ga', nil,  ':KKundl', 'KK', 'Kontrollstellekundl' };
 l2 = { 'D', nil, 'c', nil, nil,  nil, 'L2', 'Leonid 2' }; 
 l5r = { 'U', 'n', 'c', 'di', nil,  ':Lothar520', 'L5', 'Lothar520' };
 la = { 'I', nil, 'c', 'gi', nil,  ':Lamberto', 'LA', 'Lamberto99' }; 
 lhr = { 'U', 'n', 'c', 'di', nil,  ':Losch', 'LH', 'Losch' };
 lm = { 'I', nil, 'c', 'gf', nil,  ':LeMorvand', 'LM', 'LeMorvandiau' };
 lp = { 'I', nil, 'c', 'sx', nil,  ':Lokal_Profil', 'LP', 'Lokal_Profil',nil ,nil, 'Images by Lokal_Profil/CoA'};
 lu = { 'I', nil, 'c', 'di', nil,  ':Ludger1961', 'LU', 'Ludger1961' };
 lv = { 'D', nil, 'c', 'gr', nil,  ':Lobachev', 'LV ', nil, '[[User:Лобачев Владимир|Lobachev]]' };
 ly  = { 'I', nil, 'c', 'gi', nil,  ':Lynxlynx', 'LY', 'Lynxlynx' };
 lyr = { 'U', 'n', 'c', 'gi', nil,  ':Lynxlynx', 'LY', 'Lynxlynx' };
 ma = { 'I', nil, 'c', 'gf', nil,  ':Manassas', 'MA', nil,'[[User talk:Manassas~commonswiki|Manassas]]' };
 mb = { 'I', nil, 'c', 'gh', nil,  ':Madboy', nil, 'Madboy74',nil, 'CoA by Madboy74' };
 mc = { 'I', nil, 'eh','ei', nil,  ':Macucal', 'MC', 'Macucal',nil, nil, 'User:Macucal' };
 me = { 'I', nil, 'c', 'gi', nil,  ':MostEpic', 'ME', 'MostEpic' }; 
 mg = { 'I', nil, 'c', 'gP', nil,  ':Magul', nil, 'Magul' };
 mgr = { 'U', 'n', 'c', 'gP', nil,  ':Magul', 'MG', 'Magul' };
 mi = { 'I', nil, 'c',  nil, nil,  nil, nil, 'Milenioscuro',nil, nil, 'Coats of arms by User:Milenioscuro' };
 ml = { 'I', nil, 'c', 'dw','no',  ':MaxxL', nil, 'MaxxL',nil, 'CoA by MaxxL' };
 mmr = { 'u', 'n', 'c', 'gi', nil,  ':Massimop', 'MM', 'Massimop' };
 mn = { 'I', nil, 'c', 'ge', nil,  ':Miguillen', 'MN', 'Miguillen' };
 mx = { 'I', nil, 'c', 'di', nil,  ':Maxwxyz', 'MX', 'Maxwxyz' };
 n7 =  { 'I', nil, 'c',  nil, nil,  nil, 'N7', 'Nanin7' };
 ne = { 'I', nil, 'c', 'gf', nil,  ':Nescd', 'NE', 'Nescd' };
 ng =  { 'I', nil, 'c', 'gc', nil,  ':Ng556', 'NG', 'Ng556' };
 nge=  { 'I', nil, 'eh','gc', nil,  ':Ng556', 'NG', 'Ng556' };
 np = { 'I', nil, 'c', 'gp', nil,  ':NPortuguês', 'NP', 'N.Português' };
 od = { 'I', nil, 'c', 'gf', nil,  ':Odejea', nil, 'Odejea',nil, nil, 'Files by Odejea/SVG coat of arms' };
 ode = { 'I', nil, 'eh','gf', nil,  ':Odejea', nil, 'Odejea',nil, nil, 'Files by Odejea/SVG ecclesiastical coat of arms' };
 odr = { 'Blender', 'n', 'c','gf', nil, ':Odejea','OD', 'Odejea',nil, nil, 'Files by Odejea/PNG coat of arms' };
 p4 = { 'A', nil, 'c', 'di', nil,  ':Puck04', 'P4', 'Puck04' };
 p7 = { 'I', nil, 'c', 'fi', nil,  ':Peter17', 'P7', 'Peter17',nil, nil, 'Images by Peter Potrowl' }; -- in user templ. 
 pc = { 'Im',nil, 'c', 'gf', nil,  ':Pce13', 'PC', 'Pce13' };
 ph = { 'I', nil, 'c', 'di', nil,  ':Perhelion', 'PH', 'Perhelion' };
 pi = { 'I', nil, 'eh','gP', nil,  ':Piom', 'PI', 'Piom',nil, nil, 'Pictures by PioM' };
 pir = { 'U', 'n', 'eh','gP', nil,  ':Piom', 'PI', 'Piom',nil, nil, 'Pictures by PioM' };
 pn = { 'I', nil, 'c', 'di', nil,  ':Philnate', 'PN', 'Philnate' };
 po = { 'A', nil, 'c', 'gr', nil,  ':Popadius', 'PO', 'Popadius' };
 r2 = { 'I', nil, 'c',  nil, nil,  nil, 'R2', 'RaFaDa20631' };
 ra = { 'I', nil, 'c', 'gP', nil,  ':Ragimiri', 'RA', 'Ragimiri' }; 
 rc = { 'A', nil, 'c',  nil, nil,  nil, 'RC', 'Regicollis' };
 rgr = { 'U', 'n', 'c', 'di', nil,  ':Repgow', 'RG', 'Repgow' };
 rl = { 'U', nil, 'c', nil, nil,  nil, 'RL', 'RootOfAllLight' }; -- ':R-O-A-L'
 rlr = { 'U', 'n', 'c', nil, nil,  nil, 'RL', 'RootOfAllLight' }; -- ':R-O-A-L'
 rn = { 'I', nil, 'c', 'gf', nil,  ':Rinaldum', 'RN', 'Rinaldum' };
 rq = { 'I', nil, 'c',  nil, nil,  nil, 'RQ', nil,'[[User:RoboQwezt0x7CB|Roqz]]' }; 
 rv = { 'I', nil, 'c', 'gi', nil,  ':Ruthven',nil, 'Ruthven',nil, 'CoA by Ruthven' };
 rve = { 'I', nil, 'eh','gi', nil,  ':Ruthven',nil, 'Ruthven',nil, 'CoA by Ruthven' };
 s0 = { 'I', nil, 'c', 'gf', nil,  ':Spax89', nil, 'Spax89',nil, 'CoA by Spax89' };
 s1 = { 'I', nil, 'c', 'gf', nil,  ':Spax89', '89', 'Spax89' };  -- noshow invalid, and don't subcat
-- s3 = { 'I', nil, 'c',  nil, nil,  nil, 'S3', 'Skjoldbro' };
 s7 = { 'I', nil, 'c', 'gf', nil,  ':Ssire', 'S7', 'Ssire' };   -- + c, + e
 sa = { 'I', nil, 'c',  nil, nil,  nil, nil, 'SajoR',nil, 'CoA by SajoR' };
 sae = { 'I', nil, 'eh', nil, nil,  nil, nil, 'SajoR',nil, 'Escudos eclesiásticos de SajoR' };
 se = { 'I', nil, 'c', 'di', nil,  ':Simon.E', nil, 'Simon.eller',nil, 'CoA by Simon Eller' };
 sf = { 'I', nil, 'c',  nil, nil,  nil, 'SF', 'Srfortes' };
 sg = { 'Im',nil, 'c', 'gf', nil,  ':Sanguinez', 'SG', 'Sanguinez' };
 sge = { 'Im',nil, 'eh','gf', nil,  ':Sanguinez', 'SG', 'Sanguinez' };
 si = { 'A', nil, 'c', 'gH', nil,  ':Sidonius', 'SI', 'Sidonius' };
 sj = { 'I', nil, 'c',  nil, nil,  nil, 'SJ', 'Ssolbergj' };
 sk = { 'I', nil, 'c',  nil,'fl',  nil, nil, 'SteveK', nil, 'CoA by SteveK', 'COA by SteveK' };
 skw = { 'I', nil, 'c', 'gd','sx',  nil, nil, 'SteveK', nil, nil, 'COA by SteveK' };
 sl = { 'Ac',nil, 'c', 'gH', nil,  ':Spinner2', 'SL', 'SpinnerLaserzthe2nd' }; 
 sm = { 'I', nil, 'c',  nil, nil,  nil, 'SM', 'Samhanin' };
 sn = { 'I', nil, 'c', 'ei', nil,  ':SeñorDLN', 'SN', 'ElSeñorDeLaNoche' };
 so = { 'I', nil, 'c', 'gl', nil,  ':Sodacan', 'SO', 'Sodacan' };
 sp = { 'I', nil, 'c', 'gf', nil,  ':Spedona', 'SP', 'Spedona' };
 sq = { 'I', nil, 'c', 'ge', nil,  nil, 'SQ', nil,'[[User:SanchoPanzaXXI~commonswiki|SanchoPanzaXXI]]', nil, 'Graphics by User:SanchoPanzaXXI' };
 sr = { 'I', nil, 'c', 'fx', nil,  ':SanglierT', 'SR', 'SanglierT' };
 sre = { 'I', nil, 'eh','fx', nil,  ':SanglierT', 'SR', 'SanglierT' };
 ss = { 'I', nil, 'c', 'gH', nil,  ':Sandro S.', 'SS', 'Sa-se' };
 st = { 'I', nil, 'c', 'gf', nil,  ':Stella3', 'ST', 'Stella3' };
 su = { 'I', nil, 'c', 'gs', nil,  ':C.Sundin', 'SU', 'C.Sundin',nil, nil, 'Images by User:C.Sundin' };
 sy = { 'I', nil, 'c', 'gf', nil,  ':Syryatsu', nil, 'Syryatsu',nil, nil, 'Blason par Syryatsu' };
 syr = { 'Photoshop', 'n', 'c', 'gf', nil,  ':Syryatsu', 'SY', 'Syryatsu',nil, nil, 'Blason par Syryatsu' };
 ta = { 'I', nil, 'c', 'gH', nil,  ':Taktaal', 'TA', 'Taktaal' };
 tf = { 'I', nil, 'c', 'cs', nil,  ':TFerenczy', 'TF', 'TFerenczy' };
 tk = { 'I', nil, 'c', 'gf', nil,  ':TomKr', 'TK', 'TomKr' };
 tl = { 'I', nil, 'c', 'gf', nil,  ':Lanaud', 'TL', 'Thom.Lanaud' };
 tlu = { 'U', nil, 'c', 'gf', nil,  ':Lanaud', 'TL', 'Thom.Lanaud' };
 to = { 'I', nil, 'c', 'nl', nil,  ':Tom-L', 'TO',  'Tom-L' };
 tr = { 'I', nil, 'c', 'di', nil,  ':TRystau', 'TR',  nil,'[[User talk:Ollemarkeagle|T. Rystau]]' };
 trr = { 'U', 'n', 'c', 'di', nil,  ':TRystau', 'TR',  nil,'[[User talk:Ollemarkeagle|T. Rystau]]' };
 tu = { 'Im',nil, 'c',  nil, nil,  nil, 'TU', nil,'[[User:Tomas.urban|Tomáš Urban]]' };
 tur = { 'U', 'n', 'eh', nil, nil,  nil, 'TU', nil,'[[User:Tomas.urban|Tomáš Urban]]' };
 tv = { 'I', nil, 'c', 'gf', nil,  ':Tretinville', 'TV',  'Tretinville',nil, nil, 'Blasons Tretinville' };
 v1 =  { 'A', nil, 'c',  nil, nil,  nil, 'V1', 'ViniciusBR11' };
 v9 =  { 'I', nil, 'c', 'gi', nil,  ':Vale93b', nil, 'Vale93b',nil, 'CoA by Vale93b', 'U:Vale93b' };
-- v9e=  { 'I', nil, 'eh','gi', nil,  ':Vale93b', nil, 'Vale93b',nil, 'Ecclesiastical heraldry by Vale93b', 'U:Vale93b' }; 
 v9h=  { 'U', 'n', 'eh','gi', nil,  ':Vale93b', nil, 'Vale93b',nil, 'CoA by Vale93b', 'U:Vale93b' };
 v9r=  { 'U', 'n', 'c', 'gi', nil,  ':Vale93b', nil, 'Vale93b',nil, 'CoA by Vale93b', 'U:Vale93b' };
 va = { 'I', nil, 'c', 'gf', nil,  ':B.Vallette', 'VA', nil,'[[User:Bruno Vallette|Bruno]]' };
 vd = { 'I', nil, 'c', 'gf', nil,  ':Vddbert', 'VD', 'Vddbert' };
 vde = { 'I', nil, 'eh','gf', nil,  ':Vddbert', 'VD', 'Vddbert' };
 vor = { 'U', 'n', 'c', 'uk', nil,  ':VityOKM', 'VO', 'Vity OKM' };
 wa = { 'I', nil, 'c', 'gf', nil,  ':Wagner51', 'WA', 'Wagner51' };  -- + c, + e
 wh = { 'T', nil, 'c', 'di', nil,  ':Walderich', 'WH', 'Walderich' };
 wk = { 'I', nil, 'c',  nil, nil,  nil, 'WK',  nil,'[[User:Wikimandia|Kaliforniyka]]' };
 xv = { 'I', nil, 'c', 'ge', nil,  ':Xavigivax', 'XV', 'Xavigivax' };
 yr = { 'Im',nil, 'c', 'gf', nil,  ':Yricordel', 'YR', 'Yricordel' };
 za = { 'I', nil, 'c', 'gf', nil,  ':Zardoz91', 'ZA', 'Zardoz91',nil, nil, 'SVG coats of arms of France'};
 zi = { 'I', nil, 'c', 'gf', nil,  ':Zigeuner', 'ZI', 'Zigeuner' }; -- Alt
 zo = { 'I', nil, 'c', 'gf', nil,  ':Zorlot', 'ZO', 'Zorlot' };
--- formatting:
 v   = { '=========', '==', '==', '==' }; -- separator
-- labs:           these are all reserved pseudo keys
 h = { 'I', nil, 'c', 'gH' }; -- ch
 cz = { 'I', nil, 'c', 'cs' }; -- cs
 d = { 'I', nil, 'c', 'gd' }; -- de
 dc = { 'I', nil, 'ce','gd' }; -- de charges
 de = { 'I', nil, 'eh','gd' }; -- de eccles.
 di = { 'I', nil, 'c', 'di' }; -- de individ
 dx = { 'I', nil, 'c', 'gd' }; -- de catonly
 e = { 'I', nil, 'c', 'ge' }; -- es
 ec = { 'I', nil, 'ce','ge' }; -- es charges
 ee = { 'I', nil, 'eh','ge' }; -- es eccles.
 ei = { 'I', nil, 'c', 'ei' }; -- es individ
 ex = { 'I', nil, 'c', 'ge' }; -- es catonly
 f = { 'I', nil, 'c', 'gf' }; -- fr
 fc = { 'I', nil, 'ce','gf' }; --  fr charges
 fe = { 'I', nil, 'eh','gf' }; --  fr eccles. 
 fi = { 'I', nil, 'c', 'fi' }; -- fr individ
 fx = { 'I', nil, 'c', 'gf' }; -- fr catonly
 gc = { 'I', nil, 'c', 'gc' }; -- common
 it = { 'I', nil, 'c', 'gi' }; -- it
 nl = { 'I', nil, 'c', 'nl' }; -- nl
 pb = { 'I', nil, 'c', 'gf' }; -- fr project blason
 pl = { 'I', nil, 'c', 'gP' }; -- pl
 rie = { 'U', 'n', 'eh', nil }; -- raster image (+ c)
 rir = { 'U', 'n', 'c',  nil }; -- raster image
 ru = { 'I', nil, 'c', 'gr' }; -- ru
-- sx = { 'I', nil, 'c', 'gs' }; -- sv catonly
   u = { 'U', nil, 'c', 'gc', nil, ':UU' };   -- Unknown tool
   zzzz= { 'U', nil, 'c', 'gc', nil, ':??' ,nil, nil,"''substitute:''" }; -- return value for invalid key
  };

--------------------------------------------------------------------------------
 -- get extension flag ('s' when svg, otherwise another letter ) 
local function extflag ( )
 local page = mw.title.getCurrentTitle().text;
 local ptab = mw.text.split(page , '.', true)
 local extn = mw.ustring.lower( table.concat(ptab, '', #ptab  ) )
 return   mw.ustring.sub ( extn, 1, 1 )
end -- local function extflag
--------------------------------------------------------------------------------
local function uctab ( uc )
 local p1 = mw.ustring.lower( uc ) or 'nihl';
 local p2 = p1;
 if #p1 == 2 then
  if extflag() ~= 's'  then
   p2 = p1..'r';      -- raster
  elseif gratop == 'eh' then
   p2 = p1..'e';      -- ecclesiastical
  elseif gratop == 'ce' then
   p2 = p1..'c';      -- charges
  end
 end
 if #p1 == 3 then
  if mw.ustring.sub(p1,3) == 'c'    -- charges
  or mw.ustring.sub(p1,3) == 'e'    -- ecclesial
  or mw.ustring.sub(p1,3) == 'r' then  -- rasters
   p1 = mw.ustring.sub(p1,1,2);  -- shorten
  end
 end
 if   utab[mw.ustring.lower(p2)] ~= nil then 
  return utab[mw.ustring.lower(p2)];  -- expanded key
 elseif utab[mw.ustring.lower(p1)] ~= nil then 
  return utab[mw.ustring.lower(p1)];  -- original key
 else
  return utab[mw.ustring.lower('zzzz')]; -- neither exist
 end 
end -- local function utab
--------------------------------------------------------------------------------
------------------------🔶🔶🔶🔶🔶🔶🔶🔶 ---------------------------------------
--------------------------------------------------------------------------------
-- global function - with the user code table
function p.main ( frame )   -- invoked from template:COAInformation
 local lpar   = frame.args
 local parstr = mw.text.trim(lpar[1] or ' '); -- slash-separated 
 local tmplte = mw.text.trim(lpar[2] or 'Igen'); -- or c/f/m ?
 local gratop = mw.text.trim(lpar[3] or 'c'); -- graphic lab topic
 local inptab = {};
 local outtab = {};
 local argtab = mw.text.split( parstr, "/" ); -- becomes "|"
  local labtb =         -- corresponds with {{Igen/glc}}
 {-- parm 4 = g_lab  coa   charge  eccles  indiv.  catonly  Wappenwerkst   
   g7 = 'g7'; g8 = 'g8'; g9 = 'g9';  -- + Baltic
   ga = 'ga';  gB = 'gB'; 
   gc = 'gc'; br = 'br';     -- Breton            cx = 'gc';
   gd = 'gd'; d = 'gd'; dc = 'gd'; de = 'gd'; di = 'gd'; dx = 'gd'; dw = 'gd';
   ge = 'ge'; e = 'ge'; ec = 'ge'; ee = 'ge'; ei = 'ge'; ex = 'ge';
   gl = 'en'; 
   gf = 'gf'; f = 'gf'; fc = 'gf'; fe = 'gf'; fi = 'gf'; fx = 'gf'; 
   gH = 'gH';          Hi = 'gH';
   gi = 'gi';    gl = 'gl';  gh = 'gh';
   gp = 'gp'; gP = 'gP'; gr = 'gr'; nl = 'nl'; ph = 'ph'; ru = 'ru'; uk = 'uk';      
   gs = 'gs';          si = 'gs'; sx = 'gs'; su = 'fi'; 
   xx = 'xx';  cx = 'cx'; cs = 'cs';  dn = '  ';  nn = '  '; 
 };  

  local nattb = { g7='et'; g8='lt'; g9='lv'; ga='at'; gB='eu'; gc='cm'; gd='de'; ge='es'; 
      gf='fr'; gH='ch'; gh='hu'; gi='it'; gp='pt'; gP='pl'; gr='ru'; br='br';
      gl='en'; gs='sv'; nl='nl'; ph='ph'; uk='uk'; fi='fi'; cs='cs';};
 local natio = '';
  local toptb = { 'm', 'lm', 'wm', 'ggg', 'f', 'ffi', 'c', 'ce', 'eh', 'ee' };
 local modtb = { 'dc', 'de', 'di', 'dx', 'dw', 'dn', 'nn' };  -- Lab modification
  local coatb = { c = 'c'; ce = 'c'; eh = 'c'; ee = 'c'; }
  local v_stb = { lf = ''; fl = ''; nl = ''; no = ''; none = ''; sx = ''; }
 local othtb = {};
  othtb [1] = '+';  -- re_insert the "+"


 if gratop == ''  then gratop = 'c';  end  -- test
 if lpar["el"] == 'y' then gratop = 'ce'; end  -- test 'ce' for element (charge)
 if lpar["eh"] == 'y' then gratop = 'eh'; end  -- test 'eh' for ecclesial coa
 if lpar["el"] == 'y'
 and lpar["eh"] == 'y' then gratop = 'ee'; end  -- test 'ee' for ecclesial element
 if tmplte == 'c'   -- coa
 or tmplte == 'f'   -- flag
 or tmplte == 'm' then  -- map
  if gratop ~= "ce" 
  and gratop ~= "ee" 
  and gratop ~= "eh" then -- graphic lab topic comes with second parameter 
   gratop  = tmplte -- c, f, m
  end
  tmplte  = 'Igen'
 end

--1:  get values from input parameter, to inptab
 for i, v in ipairs(argtab) do
  v = mw.ustring.gsub( v, "  " , "↔" ),_;  -- double spaces
  v = mw.ustring.gsub( v, " " , "" ),_;   -- remove spaces
  v = mw.ustring.gsub( v, "[↔_]" , " " ),_;  -- but make spaces from _ and ↔ U+2194 (8596)
  local fpos = nil;
  if v ~= '' then
   v = mw.ustring.gsub( v, "[¦\\]" , "/" ),_;-- repl brokenbar (or "\") by slash;
   v = mw.ustring.gsub( v, "¡" , "\\" ),_; -- repl inv. "!" by "\"
   if v == '~' then 
    fpos = nil; 
   else
    fpos = mw.ustring.find( mw.ustring.sub(v,2), '~' ); -- "~" becomes "="
   end
   if fpos == nil then  -- pos, par
    if v == '×' then simpl = '×'; end 
    if v ~= '+' then
     if i < 6 then  
      inptab [i] = v; -- positional trimmed 
     else
      outtab [i] = v;
     end
    end
   else
    local parmn = mw.text.trim(mw.ustring.sub ( v, 1, fpos ));
    if '+' ~=  mw.ustring.sub ( v, fpos+2 ) then
     if parmn == 'ca'  or parmn == 'cat2'
     or parmn == 'gc'
     or parmn == 'sd'
     or parmn == 'su' or parmn == 'sub:'
     or parmn == 'U' or parmn == 'u' 
 --     or parmn == 'k'
     or parmn == 'tool' then  -- is a known parmname
      inptab [ parmn ] = mw.ustring.sub ( v, fpos+2 );
     else
      outtab [ parmn ] = mw.ustring.sub ( v, fpos+2 );
     end
    end
   end
  end
 end 

--2: All parameters are processed; check now the inptab
 for i = 1, #modtb do    -- (if inptab[4] == nil then) 
  if inptab[2] == modtb[i] then -- was Uu/ll
   inptab[4]  = inptab[2];  -- gralab modification
   inptab[2]  = nil;
  end 
  end
 for i = 1, #modtb do
  if inptab[3] == modtb[i] then -- was Uu//ll 
   inptab[4]  = inptab[3];
   inptab[3]  = gratop;
  end 
 end
 local iparm1 = inptab[1];  -- tool or user_short_code key
 local iparm2 = inptab[2];  -- error count   or missing=nil 
 local iparm3 = inptab[3];  -- topic c/ce/eh or missing=gratop
-- special case: gratop = ce, and inptab[3] = eh: ee = ecclesiastical element
--        or gratop;
 local iparm4 = inptab[4];  -- graphic lab   or missing
 local iparm5 = inptab[5];  -- vstyle        or  missing 
-- Named parameters  (maybe nil)
 local ipargc = inptab['gc']; -- parameter gc= 
 local iparsd = inptab['sd']; -- parameter sd= 
 local iparuu = inptab['U'];  -- parameter U= 
 local iparul = inptab['u'];  -- parameter u= 
 -- local iparky = inptab['k'];  -- parameter k= 
 local iparsu = inptab['sub:'] or inptab['su']; -- sub:= 
 local iparca = inptab['cat2'] or inptab['ca']; -- cat2=

-- test parm2 to parm5 for their values
 coatb ["-"] = ''; labtb ["-"] = ''; v_stb ["-"] = '';
 if iparm2 ~= nil then
  if tonumber(iparm2)== nil then othtb[2] = iparm2; iparm2 = nil;
  end
 end
 if iparm3 ~= nil then
  if coatb [iparm3] == nil then othtb[3] = iparm3; iparm3 = nil;
  end
 end
 if iparm4 ~= nil then
  if labtb [iparm4] == nil then othtb[4] = iparm4; iparm4 = nil;
  end
 end
 if iparm5 ~= nil then
  if v_stb [iparm5] == nil then othtb[5] = iparm5; iparm5 = nil;  
  end
 end
-- solve the special case of numeric parm1
 if iparm2 == nil 
 and tonumber(iparm1) ~= nil then
  iparm2  = iparm1;    --  numeric error count
  iparm1  = 'I';    -- default tool
 end

--3: get values from the uctab with key: iparm1
 local etab  = {};
 etab  = uctab ( iparm1 );  -- call the local function 💜💜💜💜💜💜💜💜
 if etab [6] == ':??' then
--  etab [6]  = ':'..mw.ustring.upper(iparm1);   -- subst 'gc'
  etab [9]  = etab [9]..' '..mw.ustring.upper(iparm1);-- subst 'ul'
 end
 
--4: replace values ( set 'nil' when "-", or may be kept 'nil' )
 if iparsd ~= nil then etab [10] = nil; end  
 if iparsu ~= nil then etab [7] = nil; end  
 outtab [1] = inptab ['tool'] or etab [1]; -- converted value - NOT iparm1 key !
 if iparm2 == '-' then outtab [ 2 ] = nil;
      else outtab [ 2 ] =   iparm2 or etab [2]; end
 if etab[3] == 'eh' and gratop == 'c' then gratop  = etab [3]; end
 if iparm3 == '-' then outtab [ 3 ] = nil;
      else outtab [ 3 ] =   iparm3 or gratop or etab [3];  end
 if iparm4 == '-' then outtab [ 4 ] = nil;
      else outtab [ 4 ] =   iparm4 or etab [4]; end
 if iparm5 == '-' then outtab [ 5 ] = nil;
      else outtab [ 5 ] =   iparm5 or etab [5]; end
 if ipargc  == '-' then outtab ['gc'] = nil;
      else outtab ['gc'] =   ipargc or etab [6]; end
 if iparsd == '-' then outtab ['sd'] = nil;
      else outtab ['sd'] =   iparsd or etab [7]; end
 if iparuu == '-' then outtab ['U'] = nil;
      else outtab ['U'] =   iparuu or etab [8]; end
 if iparul == '-' then outtab ['u'] = nil;
      else outtab ['u'] =   iparul or etab [9]; end
 if iparsu == '-' then outtab ['sub:'] = nil;
      else outtab ['sub:'] =   iparsu or etab [10];end
 -- if iparky == '-' then outtab ['k'] = '~';
 --      else outtab ['k'] =   iparky; end
 if iparca == '-' then outtab ['cat2'] = nil;
      else outtab ['cat2'] =   iparca or etab [11];end
--  check whether parm 3,4,5 are topic, labcode, vs - or something else

    if gratop == 'ce' and inptab[3] == 'eh' then -- ecclesiastical element 'ee'
     outtab [3] = 'ee';
    end
 iparm3 = outtab [3];  -- topic  - or something else
 iparm4 = outtab [4];  -- gralab - or something else
 iparm5 = outtab [5];  -- vstyle - or something else 

 local glc = 'g';
 local cnt = 0;
 for i = 1, #toptb do
  if iparm3 == toptb [i] then cnt = i; end 
 end
 if cnt > 0 then    -- valid topic ?
  outtab ['s'] = iparm3;
  outtab [ 3 ] = nil;
  if cnt > 6 then   -- valid coa topic
   glc = 'glc';
   if cnt == 9 then   -- 'eh' = ecclesiastical heraldry 
    outtab ['s']  = 'eh';
        outtab ['sub:'] = 'Ecclesiastical heraldry';
--       outtab ['w']  = 
   elseif cnt == 10 then -- 'ee' = ecclesiastical element 
    outtab ['s']  = 'eh'; -- or 'ce'    ???
        outtab ['s:'] = 'ecclesiastical element';
--       outtab ['w']  = 'eccl. CoA element';
       outtab ['w']  = 'eccl. [[:en:Coat of arms|CoA]] element';
--       if 
--  -- --  outtab ['sd'] = nil; -- no further subc ?
    end
  end
 else
  outtab ['s'] = etab[3];  -- unknown topic
 end
 local save4 = iparm4;   -- etab or itab
 natio = labtb [iparm4] or '';
 if natio == '' then   -- if invalid,
  iparm4  = etab [4];   -- forget it
  natio = labtb [iparm4] or '';
 end
 if natio ~= '' then   -- valid gralab code
  outtab [ glc ]  = iparm4;   -- treat with Igen/glc
  outtab ['nat']  = natio;   -- national lab cod
  outtab ['lang'] = nattb [natio]; -- national lang code
  if save4 == iparm4 then
   outtab [ 4 ] = nil;    -- when from itab
  end
 else
  outtab ['g'] = save4;
 end
 --    for Doc Taxon (+ others?)
 if iparm4 == 'dw' then
  outtab ['gc'] =   ':'..outtab ['U'];
  outtab ['lc'] =   'n';     -- no lab cat
 else
  outtab ['lc'] =   's';     -- std lab cat
 end

 
 if iparm5 == 'nl'  or iparm5 == 'lf'  
 or iparm5 == 'sx'  or iparm5 == 'no' then
  outtab ['vs'] = iparm5;  -- valid vstyle
  outtab [ 5 ] = nil;
 else
  outtab ['vs'] = etab[5];
 end

 if  outtab ['sd'] ~= nil then -- complete 
  outtab ['sd'] = '-'..outtab['sd']; 
 end 
 
 if iparul ~= nil then   --  mutually exclusive:
  outtab['U']= nil;   -- when ul-input, U is not possible
 end 
 if iparuu ~= nil then   --  but when uu-input 
  outtab['U']= iparuu;  -- it gets independently precedence 
 end
 if extflag() ~= 's'  then
  if outtab [2] ~= nil then
    table.insert( outtab, outtab [2]  ) 
  end
  outtab [2] = 'n'
  if outtab [1] == 'A' 
  or mw.ustring.sub(outtab [1], 1, 1 ) == 'I' then
   outtab [1] = 'U';
  end
 end
 if outtab [1] == 'U'  
 and extflag() ~= 's'  then
  outtab['cat']= 'Raster images created with Other tools' -- ..':CoA<'..iparm1..'>';
 end
-- if outtab [3] == nil
-- or outtab [3] == 'c'
-- if lpar["eh"] == 'y' then 
  outtab ['s'] = gratop;  -- 'eh' or 'ee'
-- end

 for i = 1, 5 do
  if  othtb [i] ~= nil then
   table.insert(outtab, othtb [i]);
  end
 end
 if outtab['tst'] == 'yes' then
  tmplte = 'Showname';  -- final test
 end
 outtab ['k'] = '~';  -- with DEFAULTSORT
 return mw.getCurrentFrame(): expandTemplate { title = tmplte, args = outtab };
end -- function main

------------------------🔷🔷🔷🔷🔷🔷🔷🔷 ---------------------------------------

function p.distab(frame)
 local lpar  = frame.args
 local sortp = lpar[1] or ' '; -- "sort"?
 if sortp == 'sort' then
  sortp  = ' class="sortable" ';
 end
 local ixtab = {};   -- user entries
 local fitab = {};   -- pseudo keys
 local rowrw = {};
 local ixcnt = 0;
 local disct = 0;
 local disst = '';
 local valid = 'Valid';
 local lbtab = 
  { 
--  parm 1 = tool pseudo keys
   a = ''; i = ''; ia = '';  im = ''; is = ''; t = '';  u = ''; rie= ''; rir= '';
   v  = '=='; zzzz = '';
--  parm 4 = g_lab  coa   charge  eccles  indiv.  catonly  Wappenwerkst   
   g7 = 'et'; g8 = 'lt'; g9 = 'lv';   -- Baltic
   ga = 'at';  gB = 'eu';  br = 'br';   -- Breton
   gc = 'cm';
   gd = 'de'; d = 'de'; dc = 'de'; de = 'de'; di = 'de'; dx = 'de'; dw = 'de';
   ge = 'es'; e = 'es'; ec = 'es'; ee = 'es'; ei = 'es'; ex = 'es';
   gl = 'en';  -- ← "gl" is used as the key for Gimli
   gf = 'fr'; f = 'fr'; fc = 'fr'; fe = 'fr'; fi = 'fr'; fx = 'fr'; pb = 'fr';
   gH = 'ch'; h = 'ch';         Hi = 'ch';
   gi = 'it';  gl = 'en';  gh = 'hu';  it = 'it';       
   gp = 'pt';  gP = 'pl'; gr = 'ru'; nl = 'nl';  ph = 'ph'; ru = 'ru'; uk = 'uk';      
   gs = 'sv';          si = 'sv'; sx = 'sv'; su = 'fi';
   xx = 'xx'; cx = 'cx'; cs = 'cs';
   };
 local extab = { br=''; cs=''; gb=''; gl=''; gr=''; ph=''; si=''; su='' };  -- exceptions: these are (also) user keys
-- local rmtab = {  d; dc; de; di; dx; dw;  e; ec; ee; ei; ex;   f; fc; fe; fi; fx;  gH; h; a; i; ia; im; sx; t; u; v }; -- pseudo    
 local outtb = '\n<table'..sortp..' border="" style="border:1px solid #999;text-align:center;border-collapse:collapse"}">';
 outtb = outtb .. '\n<tr><th>#</th><th>key</th><th>tool</th><th>er</th><th>top</th><th>lab</th><th> — </th>'
 outtb = outtb .. '<th>gc</th><th>sd</th><th>U</th><th>u</th><th>sub</th><th>cat</th></tr>'

 local checkType = libraryUtil.checkType
 checkType('keysToList', 1, utab, 'table')

 for key, value in pairs(utab) do  --  generate table of sorted kys 
  if extab [key] ~= nil    -- exception:these are user keys
  or lbtab [key] == nil then   -- no pseudokeys (tools, g_lab)
   ixcnt = ixcnt + 1; 
   ixtab[ixcnt] = key;    -- user key
  else
   table.insert (fitab, key);  -- really defined pseudokeys
  end
 end 

 table.sort(ixtab)
 table.sort(fitab)

  table.insert (ixtab, 'v');   -- + separator
  for i = 1, #fitab do
   table.insert (ixtab, fitab[i]); -- re-insert at the end
  end
 local fvkey = false;    -- first v-key
 local outky ='';
 for rw = 1, ixcnt + #fitab + 1  do -- "v" was first insertion
  local tbkey = ixtab [rw];
  disct = disct + 1; 
  if tbkey == nil then 
   break;      -- iterate
  end
  if lbtab [tbkey] ~= nil then  -- user key also lab key
   outky  = "<kbd>''"..tbkey.."''</kbd>";
  else
   outky  = '<kbd>'..tbkey..'</kbd>';
  end
  disst = tostring(disct);
  if tbkey == 'v' then 
--   if fvkey  then 
--    break;     -- iterate
--   end
   fvkey = true;
   outky = '===';  -- separator
   disct = 0; 
   disst = ''; 
  end 
  if lbtab [tbkey] ~= nil   --  lab  
  and lbtab [tbkey] ~= '=='   -- sep.
  and extab [tbkey] == nil  then  -- [gb, gl, gr, ]
--   disst = ' ';   -- pseudo lab
--   disct = disct - 0; 
  end

  rowrw = uctab ( tbkey );
  outtb = outtb .. '\n<tr><td>'..disst..'</td><td>'..outky..'</td>'
  local bmp = false;
  if mw.ustring.sub(tbkey,3,3) == 'r' then     -- raster
   bmp = true;
  end
  for cl = 1, 11 do
   if cl == 7 and rowrw [7] ~= nil and rowrw [10] ~= nil then
    outtb = outtb ..'<td style="background:#FC6">'  -- hilite error 
   else 
    outtb = outtb ..'<td>'
   end 
   if rowrw [cl] ~= nil then 
    if cl == 8 then
      outtb = outtb .. '[[User:'..rowrw [8]..'|'..rowrw [8]..']]';
    elseif cl == 11 then 
      outtb = outtb .. '[[:Category:'..rowrw [11]..'|'..rowrw [11]..']]';
    elseif cl == 6 then
     if rowrw [4] == 'dw' then 
       outtb = outtb .. '[[:Category:Wappenwerkstatt' ..rowrw [6]..'|'..rowrw [6]..']]';
     else
      local labix = rowrw [4] or 'xx';
       outtb = outtb .. '[[:Category:CoA Lab-'..(lbtab[labix] or '') ..rowrw [6]..'|'..rowrw [6]..']]';
     end
    elseif cl == 7 then
        valid = 'Valid';
     local toolx = 'Inkscape';   -- also IA, Im, Io, Is ... 
      if rowrw [1] == 'T' then toolx = 'Text Editor'; 
     elseif rowrw [1] == 'U' then toolx = 'Other tools'; 
     elseif rowrw [1] == 'A' then toolx = 'Adobe Illustrator';
     elseif rowrw [1] == 'D' then toolx = 'CorelDRAW';
     elseif rowrw [1] == 'F' then toolx = 'Fig2SVG';
     elseif rowrw [1] == 'Ac' then toolx = 'Vectornator'; 
              valid = 'Invalid';
     elseif mw.ustring.sub(rowrw[1],1,1) ~= 'I' then 
      toolx =  rowrw [1]
     end
     toolx = toolx .. ':CoA';
     if bmp then 
      outtb = outtb .. '[[:Category:Raster images created with '..toolx..'-'..rowrw [7]..'|'..rowrw [7]..']]';
     else
      outtb = outtb .. '[[:Category:'..valid..' SVG created with '..toolx..'-'..rowrw [7]..'|'..rowrw [7]..']]';
     end
    elseif cl == 10 then 
     if bmp then 
      outtb = outtb .. '[[:Category:Raster images created with Other tools:'..rowrw [10]..'|'..rowrw [10]..']]';
     else
      outtb = outtb .. '[[:Category:Valid SVG created with Inkscape:'.. rowrw [10]..'|'..rowrw [10]..']]';
     end
    else 
     outtb = outtb .. rowrw [cl];
    end 
    end
   outtb = outtb .. '</td>'
  end
  outtb = outtb .. '</tr>'
 end
 outtb = outtb .. '\n</table>';
 return  outtb;
end -- function distab

------------------------🔸🔸🔸🔸🔸🔸🔸🔸 ---------------------------------------

 function p.catg(frame)   -- definitions for user category
 local lparm = frame.args -- global param
 local uname = lparm[1];   -- or ???
 local csrpl = lparm['r+'];  -- catseealso raster 
 local csrmn = lparm['r-'];  --
 local unam2 = mw.text.trim(lparm[2]  or uname);  
 local natlb = lparm[4];
 local outtb = {};
 local tooln = '???';
 local rtval = '';
 local cname = '';
 local cnamu = nil;
 local cnamu = nil;
 local cnamr = '';
 local cattx = '';
 local txttb = {};
 local sl    = 24;
 local ul    = 4;
 local cttxt = ' drawers';

 cname = mw.title.getCurrentTitle().text
 if unam2 == nil  or unam2 == ''  or unam2 == ' ' then
  unam2 = uname;     -- didn't work ?
 end  
 if mw.ustring.sub(cname,1,1) == 'V' then
  cnamv = 'In' ..mw.ustring.lower(mw.ustring.sub(cname,1,1))..(mw.ustring.sub(cname,2));
  cnamr = mw.ustring.sub(cname,10,23);
 elseif mw.ustring.sub(cname,1,1) == 'I' then
  cnamv = mw.ustring.upper(mw.ustring.sub(cname,3,3))..(mw.ustring.sub(cname,4));
  cnamr = mw.ustring.sub(cname,12,25);
  sl = 26;
 else
  cnamv = nil;
 end
 if mw.ustring.sub(cname,-#uname-4,-#uname-1) == ' by ' then
  ul = #uname+4;    -- _by_username
  cttxt = ' by user';
 end

 if cname ~= nil then
  if   mw.ustring.sub(cname,sl,sl+7) == 'Inkscape'  then tooln = 'Inkscape';   
  elseif mw.ustring.sub(cname,sl,sl+10)== 'Other tools' then tooln = 'Other tools';   
  elseif mw.ustring.sub(cname,sl,sl+10)== 'Text Editor' then tooln = 'Text Editor';   
  elseif mw.ustring.sub(cname,sl,sl+10)== 'Adobe Illus' then tooln = 'Illustrator';   
  elseif mw.ustring.sub(cname,sl,sl+6) == 'Fig2SVG'  then tooln = 'Fig2SVG'; 
  elseif mw.ustring.sub(cname,sl,sl+8) == 'CorelDRAW' then tooln = 'CorelDRAW'; 
  elseif mw.ustring.sub(cname,sl,sl+9) == 'DrawShield' then tooln = 'DrawShield';   
  else tooln = 'Unknown tool';
  end
 end 

 if uname ~= nil 
 and cname ~= nil then
  if mw.ustring.sub(uname,1,1) ~= '['
  and mw.ustring.sub(uname,1,1) ~= '}' then 
   cnamu ='[[Special:ListFiles/'..uname..'|📤]] &nbsp;'
   uname = '[[User:'..uname..'|'..unam2..']]';
  end
  tooln = '[[Template:Created with '..tooln..'|'..tooln..']]';
  txttb['br']='Ardamezioù krouet gant '..uname..' gant '..tooln..'.';
  txttb['cs']='Erb vytvořený uživatelem '..uname..' pomocí nástroje '..tooln..'.';
  txttb['de']='Wappen die der Benutzer '..uname..' mittels '..tooln..' erstellt hat.';
  txttb['en']='Coat of arms created by the user '..uname..' using '..tooln..'.';
  txttb['es']='Escudos creados por el usuario '..uname..' utilizando '..tooln..'.';
  txttb['et']='Kasutaja '..uname..' poolt '..tooln.."'i abil loodud vapp."; 
  txttb['eu']=uname..' lankideak '..tooln..' erabiliz sortutako armarriak.'; 
  txttb['fi']= uname..'-käyttäjän '..tooln..'-ohjelmalla luoma vaakuna.';
  txttb['fr']="Blasons créés par l'utilisateur "..uname.." à l'aide de "..tooln..".";
  txttb['hu']= uname..' felhasználó által '..tooln..' segítségével készített címer.';
  txttb['it']='Stemmi creati dall utente '..uname..' usando '..tooln..'.';
  txttb['lt']='Herbas, sukurtas naudotojo '..uname..' naudojant '..tooln..'.';
  txttb['lv']='Ģerbonis, ko izveidojis lietotājs '..uname..', izmantojot '..tooln..'.';
  txttb['nl']='Wapen gemaakt door de gebruiker '..uname..' met '..tooln..'.';
  txttb['pl']='Herb stworzony przez użytkownika '..uname..' przy użyciu '..tooln..'.';
  txttb['pt']='Escudo de armas criado pelo utilizador '..uname..' com '..tooln..'.';
  txttb['ru']='Герб, созданный пользователем '..uname..' с помощью '..tooln..'.';
  txttb['sv']='Vapensköld skapad av användaren '..uname..' med '..tooln..'.';
  txttb['tr']=uname..' kullanıcısı tarafından '..tooln..' ile oluşturulan arma.';
  txttb['uk']='Герб, створений користувачем '..uname..' за допомогою '..tooln..'.';
 end 
  if cnamu ~= nil then
  cattx = cnamu;   -- appears only when cnamv 
 end
 if cnamv ~= nil then
  cattx = cattx.."See also category: [[:Category:"..cnamv.."]] __HIDDENCAT__";  
  if lparm[3] == nil then
   cattx = cattx..'[[Category:'..mw.ustring.sub(cname,1,-ul)..cttxt..'| ]]';
  else 
   cattx = cattx..'[[Category:'..mw.ustring.sub(cname,1,sl-1)..lparm[3]..'| ]]';
  end
  if  mw.ustring.sub(cnamv,1,1) == 'I' then
   cattx = cattx..' &nbsp; &nbsp; with&nbsp;';
   table.insert(outtb, frame:expandTemplate{ title = "Catcont", args = { cnamv, coa='files', pref=cattx } } );
  else
   table.insert(outtb, frame:expandTemplate{ title = "=", args = { cattx..'<br />' } } );
  end
   if csrpl == 'y' then
   cattx = "<br /> &nbsp; &nbsp; ''and'' [[:Category:Raster images"..cnamr.."]]";  
     table.insert(outtb, frame:expandTemplate{ title = "=", args = { cattx..'<br />' } } );
  end
 else
  if mw.ustring.sub(cname,1,13) == 'Raster images' then
   cattx = 'All uploads by '..uname..': '..cattx; -- Special:ListFiles
   cattx = cattx..' [[Category:CoA drawers raster images| ]]__HIDDENCAT__'; -- test
--   if csrmn == 'y' then
   table.insert(outtb, frame:expandTemplate{ title = "=", args = { cattx..'<br />' } } );
  end
 end
 if txttb['de'] ~= nil then
 if natlb == 'br'  or  natlb == '+' then -- exotic languages only for such users 
    table.insert(outtb, frame:expandTemplate{ title = "Br", args = { txttb['br'] } } );
  end 
 if natlb == 'cs'  or  natlb == '+' then
  table.insert(outtb, frame:expandTemplate{ title = "Cs", args = { txttb['cs'] } } );
  end 
  table.insert(outtb, frame:expandTemplate{ title = "De", args = { txttb['de'] } } );
  if natlb == 'et'  or  natlb == 'lt'  or  natlb == 'lv'  or  natlb == '+' then
   table.insert(outtb, frame:expandTemplate{ title = "Et", args = { txttb['et'] } } );
 end
  table.insert(outtb, frame:expandTemplate{ title = "En", args = { txttb['en'] } } );
  table.insert(outtb, frame:expandTemplate{ title = "Es", args = { txttb['es'] } } );
  if natlb == 'eu'  or  natlb == '+' then 
  table.insert(outtb, frame:expandTemplate{ title = "Eu", args = { txttb['eu'] } } );
  end 
  if natlb == 'fi'  or  natlb == '+' then 
  table.insert(outtb, frame:expandTemplate{ title = "Fi", args = { txttb['fi'] } } );
  end 
  table.insert(outtb, frame:expandTemplate{ title = "Fr", args = { txttb['fr'] } } );
  if natlb == 'hu'  or  natlb  ==  '+' then
  table.insert(outtb, frame:expandTemplate{ title = "Hu", args = { txttb['hu'] } } );
 end
  table.insert(outtb, frame:expandTemplate{ title = "It", args = { txttb['it'] } } );
  if natlb == 'et'  or  natlb == 'lt'  or  natlb == 'lv'  or  natlb == '+' then
  table.insert(outtb, frame:expandTemplate{ title = "Lv", args = { txttb['lv'] } } );
    table.insert(outtb, frame:expandTemplate{ title = "Lt", args = { txttb['lt'] } } );
 end
  table.insert(outtb, frame:expandTemplate{ title = "Nl", args = { txttb['nl'] } } );
  table.insert(outtb, frame:expandTemplate{ title = "Pl", args = { txttb['pl'] } } );
  table.insert(outtb, frame:expandTemplate{ title = "Pt", args = { txttb['pt'] } } );
  if natlb == 'ru'  or  natlb == '+' then
  table.insert(outtb, frame:expandTemplate{ title = "Ru", args = { txttb['ru'] } } );
  end 
  table.insert(outtb, frame:expandTemplate{ title = "Sv", args = { txttb['sv'] } } );
  if natlb == 'tr'  or  natlb  ==  '+' then
  table.insert(outtb, frame:expandTemplate{ title = "Tr", args = { txttb['tr'] } } );
 end
  table.insert(outtb, frame:expandTemplate{ title = "Uk", args = { txttb['uk'] } } );
--  table.insert(outtb, frame:expandTemplate{ title = "  ", args = { txttb['  '] } } );
 end 
 return  table.concat (outtb)
end -- function catg

------------------------🔹🔹🔹🔹🔹🔹🔹🔹 ---------------------------------------

return p; --

Retrieved from "https://commons.wikimedia.org/w/index.php?title=Module:IgenCoa&oldid=881366096"

Categories: 
Modules for general use
Heavily used modules
 


Navigation menu


Personal tools  




English
Not logged in
Talk
Contributions
Create account
Log in
 


Namespaces  




Module
Discussion