ModuloLua per la manipolazione distringhe.
La maggior parte delle funzioni di questo modulo possono essere invocate con parametri con nome, senza nome o con un misto di entrambi. Il software diMediaWiki, quando vengono usati parametri con nome, rimuoverà ogni spazio iniziale o finale dal parametro. A seconda dell'uso che si vuole fare della funzione può essere vantaggioso conservare oppure rimuovere questi spazi.
Questo modulo è pensato per essere richiamato datemplate, non direttamente da una voce. Il modulo è richiamabile anche da un altro modulo Lua, ma in questo caso è meglio usare direttamente le funzioni Lua di manipolazione delle stringhe:
Per richiamare il modulo da un template usare la sintassi:{{{{{|safesubst:}}}#invoke:String|nome della funzione|parametro 1|parametro 2|...|parametro n|}}. Per esempio d'uso vedi il template {{Str len}}
Alcune funzioni possono dare un messaggio di errore o impostare una categoria di errori, la generazione di questo messaggio e/o la creazione di questa categoria possono essere controllate dalle seguenti opzioni.
Questa funzione restituisce la lunghezza di una stringa.
{{#invoke:String|len|stringa}}O
{{#invoke:String|len|s= stringa }}Se invocata usando parametri nominati, Mediawiki rimuoverà automaticamente ogni spazio iniziale o finale dalla stringa.
Questa funzione restituisce la sottostringa di una stringa bersaglio, come indicato dagli indici
{{#invoke:String|sub|stringa_bersaglio|indice_iniziale|indice_finale}}O
{{#invoke:String|sub|s= stringa_bersaglio |i= indice_iniziale |j= indice_finale }}I caratteri della stringa sono numerati a partire da 1. Sei oj hanno un valore negativo allora contano la posizione contando dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...
Se le posizioni sono al di fuori degli estremi della stringa viene restituito un messaggio di errore.
Questa funzione restituisce una sottostringa della stringa bersaglio corrispondente a unpattern specificato.
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}O
{{#invoke:String|match|s= source_string |pattern= pattern_string |start= start_index |match= match_number |plain= plain_flag |nomatch= nomatch_output }}Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.
Sematch ostart sono al di fuori degli estremi della stringas, allora la funzione restituisce un errore. Viene generato un errore anche se il non vengono trovate corrispondenze. Per sopprimere gli errori si può aggiungere il parametroignore_errors=true, in questo caso in caso di errore verrà restituita una stringa vuota.
Questa funzione restituisce il carattere della stringa in posizione pos.
{{#invoke:String|pos|stringa_bersaglio|indice}}O
{{#invoke:String|pos|target= stringa_bersaglio |pos= indice }}Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.
I caratteri della stringa sono numerati a partire da 1. Sepos è un valore negativo allora conta la posizione partendo dalla fine della stringa, -1 è l'ultimo carattere della stringa, -2 il penultimo, ecc...
Se la posizione richiesta è 0 o al di fuori degli estremi della stringa viene restituito un errore.
Questa funzione duplica il comportamento di {{str_find}}, inclusi i casi particolari. Questa funzione è fornita per motivi di compatibilità con i vecchi template, ma SI RACCOMANDA di non utilizzarla in nuovi template. Nello sviluppo di nuovo codice si raccomanda di usare la funzionefind.
Restituisce la posizione nella stringasource del primo carattere in cui è stata trovata la stringatarget. I caratteri della stringa sono numerati a partire da 1. La funzione restituisce -1 se la stringatarget non è contenuta insource.
Nota importante: Per compatibilità con il vecchio template, se la stringatarget è vuota o manca, la funzione restituisce il valore "1"
Questa funzione permette di cercare una stringa bersaglio o un pattern Lua all'interno di un'altra stringa.
{{#invoke:String|find|stringa_sorgente|stringa_bersaglio|indice_iniziale|plain_flag}}O
{{#invoke:String|find|source= stringa_sorgente |target= stringa_bersaglio |start= indice_iniziale |plain= plain_flag }}Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti gli spazi iniziali e finali. In alcune circostanze questo può essere il comportamento desiderato, in altre si potrebbe volerli conservare.
Questa funzione restituisce la prima posizione maggiore o uguale astart a partire dalla qualetarget si trova insource. I caratteri della stringa sono numerati a partire da 1. Setarget non viene trovato dà 0. Sesource otarget sono mancanti o vuoti dà 0.
Questa funzione dovrebbe essere sicura per stringhe UTF-8.
Questa funzione permette di rimpiazzare una stringa o pattern bersaglio con un'altra stringa.
{{#invoke:String|replace|stringa_sorgente|stringa_pattern|nuova_stringa|numero_di_sostituzioni|plain_flag}}O
{{#invoke:String|replace|source= stringa_sorgente |pattern= stringa_pattern |replace= nuova_stringa | count= numero_di_sostituzioni |plain= plain_flag }}Formatta una o più liste di valori in una singola stringa
{{#invoke:String|arraytostring|par1|formato|separatore|congiunzione}}{{#if:{{{x|}}}|$2}} si può scrivere normalmente così perché la condizione si basa sul parametro "x"; al contrario\{\{#if:$2{{!}}{{{x|}}}\}\} va scritto come appena spiegato perché la condizione si basa sul simbolo $2 che sarà sostituito solo dopo l'avvio del modulo.{{#invoke:string|arraytostring|par1=var#|separatore= |congiunzione= e }}{{#invoke:string|arraytostring|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small>|lista=infobox}}{{#invoke:String|arraytostring|par1=#|msg=''$1''|separatore=<nowiki>|</nowiki>|Nmin=2}}Questa funzione restituisce la stringa privata degli eventuali segni diacritici sulle lettere dell'alfabeto latino. Trasforma ad esempio "Çịàö" in "Ciao", preferibile ad esempio per gli ordinamenti alfabetici.
{{#invoke:String|collate|stringa}}Questa funzione accetta una stringa codificata con il sistema a percentuali usato negli URL e restituisce la stringa decodificata. Fa quindi l'opposto della funzione di sistemaurlencode. Trasforma ad esempio "Come%20va%3F" in "Come va?".
{{#invoke:String|decode|stringa}}Questa funzione accetta una stringa che corrisponde a un titolo di opera e restituisce la stringa adattata all'ordinamento alfabetico. Trasforma ad esempio "La pietà" in "Pieta, La". Non funziona sempre, non potendo capire il significato delle parole, ma risolve automaticamente la maggior parte dei casi.
{{#invoke:String|titolo_alfa|titolo}}Unit test per questo modulo sono disponibili aModulo:String/test, per la loro esecuzione visitareDiscussioni_modulo:String/test.
Diverse funzioni fanno uso di pattern Lua, questi sono una forma diespressione regolare, per maggiori informazioni sulla loro sintassi vedi:
--[[Questo modulo serve a fornire l'accesso alle funzioni stringa base.La maggior parte delle funzioni di questo modulo possono essere invocate conparametri con nome, senza nome o con un misto di entrambi. Quando vengono usatiparametri con nome il software di Mediawiki rimuoverà ogni spazio iniziale o finaledal parametro. A seconda dell'uso che si vuole fare della funzione può esserevantaggioso conservare oppure rimuovere questi spazi.Opzioni globali ignore_errors: se settato a 'true' o 1, ogni condizione di errore ritornerà una stringa vuota piuttosto che un messaggio di errore. error_category: nel caso si verifichi un errore è il nome di una categoria da includere insieme al messaggio di errore. La categoria di default [Categoria:Errori del Module String]. (TODO:verificare) no_category: Se settato a 'true' o 1, non verranno aggiunte categorie in caso di errore.Unit tests per questo modulo sono disponibili a Module:String/test.Diverse funzioni fanno uso di pattern Lua, questi sono una forma di espressione regolare, permaggiori informazioni vedi:* http://www.lua.org/manual/5.1/manual.html#5.4.1* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns]]localstr={}--[[lenQuesta funzione ritorna la lunghezza di una stringa.Uso:{{#invoke:String|len|stringa|}}O{{#invoke:String|len|s=stringa}}Parametri s: La stringa di cui ritornare la lunghezzaSe invocata usando parametri nominati, Mediawiki rimuoverà automaticamente ogni spazio inizialeo finale dalla stringa.]]functionstr.len(frame)localnew_args=str._getParameters(frame.args,{'s'});locals=new_args['s']or'';returnmw.ustring.len(s)end--[[subQuesta funzione ritorna la sottostringa di una stringa bersaglio, come indicato dagli indiciUso:{{#invoke:String|sub|stringa_bersaglio|indice_iniziale|indice_finale}}O{{#invoke:String|sub|s=stringa_bersaglio|i=indice_iniziale|j=indice_finale}}Parameters s: La stringa da cui estrarre una sottostringa i: La posizione iniziale del primo carattere della sottostringa da ritornare, se non specificato è 1. j: La posizione finale dell'ultimo carattere della sottostringa da ritornare, se non specificato corrisponde alla lunghezza della stringa_bersaglio (l'ultimo carattere).I caratteri della stringa sono numerati a partire da 1. Se i o j hanno un valore negativo alloracontano la posizione contando dalla fine della stringa, -1 è l'ultimo carattere della stringa,-2 il penultimo, ecc...Se le posizioni sono al di fuori degli estremi della stringa viene ritornato un messaggio dierrore.]]functionstr.sub(frame)localnew_args=str._getParameters(frame.args,{'s','i','j'});locals=new_args['s']or'';locali=tonumber(new_args['i'])or1;localj=tonumber(new_args['j'])or-1;locallen=mw.ustring.len(s);-- Convert negatives for range checkingifi<0theni=len+i+1;endifj<0thenj=len+j+1;endifi>lenorj>lenori<1orj<1thenreturnstr._error('Indici fuori dagli estremi della stringa');endifj<ithenreturnstr._error('Indici in ordine sbagliato');endreturnmw.ustring.sub(s,i,j)end--[[Questa funzione implementa tutte le caratteristiche di {{str sub}} e viene mantenuta per motividi compatibilità con template più vecchi.]]functionstr.sublength(frame)locali=tonumber(frame.args.i)or0locallen=tonumber(frame.args.len)returnmw.ustring.sub(frame.args.s,i+1,lenand(i+len))end--[[matchQuesta funzione ritorna dalla stringa bersaglio una sottostringa corrispondente a un patternspecificato.Uso:{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}O{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index |match=match_number|plain=plain_flag|nomatch=nomatch_output}}Parametri s: La stringa da cercare pattern: Il pattern da cercare nella stringa start: La posizione iniziale da cui iniziare la ricerca, se non specificato è 1. match: Se c'è ci sono corrispondenze multiple quale ritornare, 1 per la prima corrispondenza, 2 per la seconda ecc.. Un valore negativo indica di contare all'indietro a partire dall'ultima corrispondenza, quindi match = -1 significa chiedere l'ultima corrispondenza. Se non specificato è 1 plain: Se vero specifica che il pattern deve essere considerato come una stringa normale, piuttosto che un pattern Lua. Se non specificata è falsa. nomatch: Il valore da ritornare se non ci sono corrispondenze, invece di ritornare un errore.Se richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti glispazi iniziali e finali. In alcune circostanze questo può essere il comportamentodesiderato, in altre si potrebbe volerli conservare.Se match_number o start_index sono al di fuori degli estremi della stringa s, allorala funzione ritorna un errore. Viene generato un errore anche se il non vengono trovatecorrispondenze. Per sopprimere gli errori si può aggiungere il parametro ignore_errors=true,in questo caso in caso di errore verrò ritornata una stringa vuota.]]functionstr.match(frame)returnstr._match(frame.args)end--[[Entry point per chiamata diretta da un modulo]]functionstr._match(args)localnew_args=str._getParameters(args,{'s','pattern','start','match','plain','nomatch'});locals=new_args['s']or'';localstart=tonumber(new_args['start'])or1;localplain_flag=str._getBoolean(new_args['plain']orfalse);localpattern=new_args['pattern']or'';localmatch_index=math.floor(tonumber(new_args['match'])or1);localnomatch=new_args['nomatch'];ifs==''thenreturnnomatchorstr._error('La stringa in cui cercare è vuota');endifpattern==''thenreturnnomatchorstr._error('La stringa o pattern da cercare è vuota');endifmath.abs(start)<1ormath.abs(start)>mw.ustring.len(s)thenreturnnomatchorstr._error('La posizione iniziale richiesta è fuori dagli estremi della stringa');endifmatch_index==0thenreturnnomatchorstr._error('Match index è nullo');endifplain_flagthenpattern=str._escapePattern(pattern);endlocalresultifmatch_index==1then-- Il caso più semplice, trova la prima corrispondenzaresult=mw.ustring.match(s,pattern,start)elseifstart>1thens=mw.ustring.sub(s,start);endlocaliterator=mw.ustring.gmatch(s,pattern);ifmatch_index>0then-- Ricerca in avantiforwiniteratordomatch_index=match_index-1;ifmatch_index==0thenresult=w;break;endendelse-- Ricerca all'indietro deve estrarre tutte le corrispondenzelocalresult_table={};localcount=1;forwiniteratordoresult_table[count]=w;count=count+1;endresult=result_table[count+match_index];endendifresult==nilthenifnomatch==nilthenreturnstr._error('Corrispondenza non trovata');elsereturnnomatch;endelsereturnresult;endend--[[posQuesta funzione ritorna il carattere della stringa in posizione pos.Uso:{{#invoke:String|pos|stringa_bersaglio|indice}}O{{#invoke:String|pos|target=stringa_bersaglio|pos=indice}}Parametri target: La stringa in cui cercare pos: La posizione del carattere da ritornareSe richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti glispazi iniziali e finali. In alcune circostanze questo può essere il comportamentodesiderato, in altre si potrebbe volerli conservare.I caratteri della stringa sono numerati a partire da 1. Se pos è un valore negativo alloraconta la posizione partendo dalla fine della stringa, -1 è l'ultimo carattere della stringa,-2 il penultimo, ecc...Se la posizione richiesta è 0 o al di fuori degli estremi della stringa viene ritornatoun errore.]]functionstr.pos(frame)localnew_args=str._getParameters(frame.args,{'target','pos'});localtarget_str=new_args['target']or'';localpos=tonumber(new_args['pos'])or0;ifpos==0ormath.abs(pos)>mw.ustring.len(target_str)thenreturnstr._error('Indice della stringa fuori dagli estremi');endreturnmw.ustring.sub(target_str,pos,pos);end--[[str_findQuesta funzione duplica il comportamento di {{str_find}}, incluso i suoi comportamentiirregolari. Questa funzione è fornita per motivi di compatibilità con i vecchi template,ma SI RACCOMANDA di non utilizzarla in nuovi template. Nello sviluppo di nuovo codicesi raccomanda di usare la funzione "find".Parametri source: La stringa in cui cercare target: la stringa da cercareRitorna la posizione nella stringa source del primo carattere in cui c'è è statatrovata la stringa target. I caratteri della stringa sono numerati a partire da 1. La funzioneritorna -1 se la stringa "target" non è contenuta in "source".Nota importante: Per compatibilità con il vecchio template se la stringa "target" è vuota o mancala funzione ritorna un valore di "1"]]functionstr.str_find(frame)localnew_args=str._getParameters(frame.args,{'source','target'});localsource_str=new_args['source']or'';localtarget_str=new_args['target']or'';iftarget_str==''thenreturn1;endlocalstart=mw.ustring.find(source_str,target_str,1,true)ifstart==nilthenstart=-1endreturnstartend--[[findQuesta funzione permette di cercare una stringa bersaglio o un pattern Lua all'interno diun'altra stringa.Uso:{{#invoke:String|find|stringa_sorgente|stringa_bersaglio|indice_iniziale|plain_flag}}O{{#invoke:String|find|source=stringa_sorgente|target=stringa_bersaglio|start=indice_iniziale|plain=plain_flag}}Parametri source: La stringa in cui cercare target: La stringa o pattern Lua da cercare start: La posizione da cui iniziare la ricerca, se non specificato è 1 plain: Se è vero indica che la stringa target deve essere considerata come una testo normale e non come un pattern Lua, se non specificata è veraSe richiamata usando parametri nominati Mediawiki rimuoverà automaticamente tutti glispazi iniziali e finali. In alcune circostanze questo può essere il comportamentodesiderato, in altre si potrebbe volerli conservare.Questa funzione ritorna la prima posizione maggiore o uguale a "start" a partire dalla quale"target" si trova in "source". I caratteri della stringa sono numerati a partire da 1.Se "target" non viene trovato ritorna 0. Se "source" o "target" sono mancanti o vuoti ritorna 0.Questa funzione dovrebbe essere sicura per stringhe UTF-8.]]functionstr.find(frame)localnew_args=str._getParameters(frame.args,{'source','target','start','plain'});localsource_str=new_args['source']or'';localpattern=new_args['target']or'';localstart_pos=tonumber(new_args['start'])or1;localplain=new_args['plain']ortrue;ifsource_str==''orpattern==''thenreturn0;endplain=str._getBoolean(plain);localstart=mw.ustring.find(source_str,pattern,start_pos,plain)ifstart==nilthenstart=0endreturnstartend--[[replaceQuesta funzione permette di rimpiazzare una stringa o pattern bersaglio con un'altrastringa.Uso:{{#invoke:String|replace|stringa_sorgente|stringa_pattern|nuova_stringa|numero_di_sostituzioni|plain_flag}}O{{#invoke:String|replace|source=stringa_sorgente|pattern=stringa_pattern|replace=nuova_stringa| count=numero_di_sostituzioni|plain=plain_flag}}Parametri: source: La stringa da cercare pattern: La stringa o pattern Lua da trovare in source replace: Il testo di sostituzione count: Il numero di volte in cui rimpiazzare la stringa, se non specificato tutte. plain: Se vero indica che il pattern deve essere considerato come testo normale e non come pattern Lua, il valore di default è vero]]functionstr.replace(frame)localnew_args=str._getParameters(frame.args,{'source','pattern','replace','count','plain'});localsource_str=new_args['source']or'';localpattern=new_args['pattern']or'';localreplace=new_args['replace']or'';localcount=tonumber(new_args['count']);localplain=new_args['plain']ortrue;ifsource_str==''orpattern==''thenreturnsource_str;endplain=str._getBoolean(plain);ifplainthenpattern=str._escapePattern(pattern);replace=mw.ustring.gsub(replace,"%%","%%%%");--Only need to escape replacement sequences.endlocalresult;ifcount~=nilthenresult=mw.ustring.gsub(source_str,pattern,replace,count);elseresult=mw.ustring.gsub(source_str,pattern,replace);endreturnresult;end--[[ Funzione per utilizzare string.rep in un template.]]functionstr.rep(frame)localrepetitions=tonumber(frame.args[2])ifnotrepetitionsthenifframe.args[2]==''then-- se il secondo parametro è una stringa nulla ritorno una stringa nullareturn''elsereturnstr._error('la funzione rep si aspetta un secondo parametro con il numero di ripetizioni, ricevuto "'..(frame.args[2]or'')..'"')endendreturnmw.ustring.rep(frame.args[1]or'',repetitions)end--[[ Funzione per decodificare una stringa codificata percentualmente. Richiama la funzione mw.uri.decode di scribunto, vedi https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#mw.uri.decode]]functionstr.decode(frame)localvalid_enctype={QUERY=true,WIKI=true,PATH=true}localnew_args=str._getParameters(frame.args,{'source','enctype'})localsource=new_args['source']or''localenc_type=new_args['enctype']or'QUERY'ifnotvalid_enctype[enc_type]thenenc_type='QUERY'endreturnmw.uri.decode(source,enc_type)end--[[ Funzione per semplificare stringhe con diacritici]]functionstr.collate(frame)localcollation={{'[áàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁⱥᶏᴂæɐᶐɒə]','a'},{'[ÁÀĂẮẰẴẲÂẤẦẪẨǍÅÅǺÄǞÃȦǠĄĀẢȀȂẠẶẬḀȺᴁÆƏ]','A'},{'[ḃḅḇƀɓ]','b'},{'[ḂḄḆɃ]','B'},{'[ćĉčċçḉȼƈ]','c'},{'[ĆĈČĊÇḈȻƇ]','C'},{'[đḍḓḏðďḋḑ]','d'},{'[ĐḌḒḎÐĎḊḐ]','D'},{'[éèĕěêếềễểëẽėȩḝęēḗḕẻȅȇẹệḙḛǝ]','e'},{'[ÉÈĔĚÊẾỀỄỂËẼĖȨḜĘĒḖḔẺȄȆẸỆḘḚƎ]','E'},{'[ḟⅎ]','f'},{'[ḞℲ]','F'},{'[ǵğĝǧġģḡᵹɠ]','g'},{'[ǴĞĜǦĠĢḠƓ]','G'},{'[ĥȟḧḣḩħḥḫẖ]','h'},{'[ĤȞḦḢḨĦḤḪ]','H'},{'[íìĭîǐïḯĩįīỉȉȋịḭı]','i'},{'[ÍÌĬÎǏÏḮĨĮĪỈȈȊỊḬİ]','I'},{'[ĵǰ]','j'},{'[Ĵ]','J'},{'[ḱǩķ]','k'},{'[ḰǨĶ]','K'},{'[ĺľļłḷḹḽḻl·l·ŀƚⱡ]','l'},{'[ĹĽĻŁḶḸḼḺL·L·ĿȽⱠ]','L'},{'[ḿṁṃ]','m'},{'[ḾṀṂ]','M'},{'[ńǹňñṅņṇṋṉ]','n'},{'[ŃǸŇÑṄŅṆṊṈ]','N'},{'[óòŏốồỗổǒôöȫőõṍṏȭȯȱøǿǫǭōṓṑỏȍȏơớờỡởợọộœ]','o'},{'[ÓÒŎỐỒỖỔǑÔÖȪŐÕṌṎȬȮȰØǾǪǬŌṒṐỎȌȎƠỚỜỠỞỢỌỘŒ]','O'},{'[ṕṗ]','p'},{'[ṔṖ]','P'},{'[ŕřṙŗȑȓṛṝṟ]','r'},{'[ŔŘṘŖȐȒṚṜṞ]','R'},{'[śṥŝṧṡşṣṩșšß]','s'},{'[ŚṤŜṦṠŞṢṨȘŠ]','S'},{'[ťṫẗţṭțṱṯ]','t'},{'[ŤṪŢṬȚṰṮ]','T'},{'[úùŭûǔůüǘǜǚǖűũṹųūṻủȕȗưứừữửựụṳṷṵʉ]','u'},{'[ÚÙŬÛǓŮÜǗǛǙǕŰŨṸŲŪṺỦȔȖƯỨỪỮỬỰỤṲṶṴɄ]','U'},{'[ṽṿʋ]','v'},{'[ṼṾƲ]','V'},{'[ẃẁŵẘẅẇẉⱳ]','w'},{'[ẂẀŴ̊ẄẆẈⱲ]','W'},{'[ýỳŷẙÿỹẏȳỷỵɏƴ]','y'},{'[ÝỲŶ̊ŸỸẎȲỶỴɎƳ]','Y'},{'[źẑžżẓẕƶȥʐⱬ]','z'},{'[ŹẐŽŻẒẔƵȤʐⱫ]','Z'},}localnew_args=str._getParameters(frame.args,{'source'})localsource=new_args['source']or''--local source = mw.ustring.toNFC(source)for_,elinipairs(collation)dosource=mw.ustring.gsub(source,el[1],el[2])endreturnsourceend--[[ Funzione per estrarre da un titolo la stringa adatta all'ordinamento alfabetico.]]functionstr.titolo_alfa(frame)-- Evito "I", "A", "Die"... che darebbero molte false corrispondenze in lingue diverselocalarticoli={"Il ","Lo ","La ","L'","Gli ","Le ","Un ","Uno ","Una ","Un'","The ","An ","Les ","El ","Los ","Las ","Der ","Das "}localsource=frame.args[1]ifnotsourceorsource==''thensource=mw.title.getCurrentTitle().textendifnotsourceorsource==''thenreturn''endsource=mw.ustring.gsub(source,' %(.*%)$','')source=str.collate({args={source}})source=mw.ustring.gsub(source,"^['%(%.¡¿ ]*",'')for_,articleinipairs(articoli)dosource=mw.ustring.gsub(source,"^("..article..")(.*)$","%2, %1")endsource=mw.ustring.gsub(source,'^%l',mw.ustring.upper)source=mw.text.trim(source)returnsourceend-- =================================================================-- Classe per gestire i parametri-- =================================================================localParam={}Param.__index=ParamfunctionParam.new(par_name,alt_name)ifpar_name~="$index"andnotmw.ustring.find(par_name,'#')thenpar_name=par_name..'#'end;returnsetmetatable({name=par_name,base_name=mw.ustring.gsub(par_name,' ?#','',1),alt=alt_name},Param)endfunctionParam:get_other_value(args,index)ifself.name=='$index'thenreturntostring(index),trueelsereturnargs[mw.ustring.gsub(self.name,'#',tostring(index),1)]or'',falseendendfunctionParam:get_first_value(args,index,base_index)functionvalue_or_nil(s)ifsands~=''thenreturnsendreturnnilendifself.name=='$index'thenreturntostring(index),trueendifindex==base_indexthenreturnvalue_or_nil(args[mw.ustring.gsub(self.name,'#',tostring(index),1)])orvalue_or_nil(args[self.base_name])orvalue_or_nil(args[self.alt])or'',falseelsereturnvalue_or_nil(args[mw.ustring.gsub(self.name,'#',tostring(index),1)])orvalue_or_nil(args[self.alt])or'',falseendendsetmetatable(Param,{__call=function(_,...)returnParam.new(...)end})-- =================================================================-- fine dichiarazione classe per parametro-- =================================================================-- =================================================================-- Classe per gestire il messaggio-- =================================================================localMessage={}Message.__index=MessagefunctionMessage.new(msg)-- converto parentesi graffe che sono state precedute da "\"msg=mw.ustring.gsub(msg,'\\{','{')msg=mw.ustring.gsub(msg,'\\}','}')localframe=mw.getCurrentFrame():getParent()ormw.getCurrentFrame()returnsetmetatable({msg=msg,values={},frame=frame,},Message)endfunctionMessage:reset_values()self.values={}endfunctionMessage:add_value(value)self.values[#self.values+1]=valueendfunctionMessage:text()returnself.frame:preprocess(mw.message.newRawMessage(self.msg,self.values):plain())endsetmetatable(Message,{__call=function(_,...)returnMessage.new(...)end})-- =================================================================-- fine dichiarazione classe per messaggio-- =================================================================--[[ Funzione per unire una o più liste di valori in una stringa.Uso:{{#invoke:String|arraytostring|par1=xxx|par2=xxx....|parn=xxxx|msg=msg|separator=|congiunzione=|pre=|post=|lista=}}Parametri: par1...parn: i nomi base dei parametri da inserire nel messsaggio, devono contenere il carattere '#' che precisa la posizione in cui inserire l'indice. Se viene valorizzato a '$index' avrà automaticamente il valore del contatore. msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere preceduti da '\', mentre una "|" dovrà essere inserita con il template {{!}}. I valori da sostituire sono da inserire come $n ($1 sarà sostituito dal valore di par1, $2 dal valore di par2, ecc...) separatore: La stringa da inserire tra ogni valore congiunzione: La stringa da inserire invece di separatore tra l'ultimo e il penultimo valore. Se non precisato viene usato il valore di separatore pre: eventuale stringa che precede l'unione delle stringhe post: eventuale stringa che segue l'unione delle stringhe indentazione: una stringa da ripetere cumulativamente per ogni messaggio (tipicamente ' ') lista: se valorizzata a: 'puntata' imposta i parametri per una lista puntata 'ordinata' imposta i parametri per una lista ordinata 'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia solo un elemento Se lista è valorizzata separatore/congiunzione/pre/post sono ignorati, salvo il caso di 'infobox' e la lista contenga solo un elemento. nmin = indice iniziale da cui partire a scandire i parametri (di default pari a 1) nmax = indice massimo a cui arrivare con i parametri (se non precisato illimitato) nobbligatori = l'indice minimo che deve essere valutato anche in presenza di buchi nella sequenza (comunque l'indice massimo che viene valutato è nmax) baseIndex = valore dell'indice che può essere sostituito da stringa nulla (default = 1)Esempi di chiamata: {{#invoke:string:arraytostring|par1=var#|separatore=,|congiunzione=#32;e#32;}} {{#invoke:string:arraytostring|par1=disegnatore #|par2=disegnatore # nota|msg = $1 <small>$2</small>|lista=infobox }} {{#invoke:string:arraytostring|par1=editore #|par2=etichetta #|par3=editore # nota| msg=$1 \{\{#if:$2{{!}}$2 <small>$3</small>\}\}|lista=infobox }}]]functionstr.arraytostring(frame)localbase_args=frame.argslocalparams={}ifnotbase_argsthenreturnstr._error('Lista parametri vuota')end-- carico la lista dei parametrilocalindex=1whiletruedolocalpar_name=base_args['par'..index]or(index==1andbase_args['par'])or''ifpar_name==''thenbreakend--carico eventuale nome alternativo per il primo parametrolocalalt_name=base_args['altpar'..index]or(index==1andbase_args['altpar'])ornilparams[index]=Param(par_name,alt_name)index=index+1end--carico il messaggiolocalmsg=base_args.msgor'$1'--if msg == '' then return str._error('Manca il messaggio da riprodurre.') endlocalmessage=Message(msg)elements={}-- carico gli altri parametri di formattazionelocalNmax=tonumber(base_args.Nmax)ortonumber(base_args.nmax)or0localbase_index=tonumber(base_args.baseindex)ortonumber(base_args.baseIndex)or1localindex=tonumber(base_args.Nmin)ortonumber(base_args.nmin)orbase_indexlocalNobbligatori=tonumber(base_args.Nobbligatori)ortonumber(base_args.nobbligatori)orbase_index-1localindentazione=base_args.indentazioneornillocalargs=frame:getParent().args-- estraggo il primo valorelocalfound=falsefori,paraminipairs(params)dolocalv,is_index=param:get_first_value(args,index,base_index)if(not(is_index)orbase_index<=Nobbligatori)andv~=''thenfound=trueendmessage:add_value(mw.text.trim(v))endiffoundthenelements[#elements+1]=message:text()index=index+1end-- elaboro i valori successiviwhiletruedoifNmax>0andindex>Nmaxthenbreakendmessage:reset_values()found=falsefori,paraminipairs(params)dolocalv,is_index=param:get_other_value(args,index)if(not(is_index)orindex<=Nobbligatori)andv~=''thenfound=trueendmessage:add_value(mw.text.trim(v))endiffoundthenelements[#elements+1]=message:text()elseifindex>=Nobbligatorithenbreakendindex=index+1endif#elements==0thenreturn''end-- carico separatori, congiunzione, pre e postazionelocalpre,post,separatore,congiunzione,indent='','','','',''locallista=base_args.listaor''iflista=='puntata'or(lista=='infobox'and#elements>1)thenpre='<UL><LI>'post='</LI>\n</UL>'separatore='</LI>\n<LI>'congiunzione=separatoreelseiflista=='ordinata'thenpre='<OL><LI>'post='</LI>\n</OL>'separatore='</LI>\n<LI>'congiunzione=separatoreelsepre=base_args.preor''post=base_args.postor''separatore=base_args.separatoreor''congiunzione=base_args.congiunzioneorseparatoreendifindentazionethenlocalcurrent_indentazione=indentazionefori,msginipairs(elements)doelements[i]=current_indentazione..elements[i]current_indentazione=current_indentazione..indentazioneendendreturnpre..mw.text.listToText(elements,separatore,congiunzione)..postend--[[ Funzione per unire una lista di valori in una stringa.Uso:{{#invoke:String|listtostring|par_number=xxx|msg=msg|separator=|congiunzione=|pre=|post=|lista=}}Parametri: par_number: il numero di parametri che compongono il messaggio msg: il messaggio (cioè la riga unitaria) in cui eventuali caratteri '{', '}' dovranno essere preceduti da '\', mentre una "|" dovrà essere inserita con il template {{!}}. I valori da sostituire sono da inserire come $n (nel primo messaggio $1 sarà sostituito dal parametro posizionale di posizione Nmin, $2 da Nmin+2, ecc...., nel secondo messaggio $1 sarà sostituito dal parametro posizionale Nmin+par_number, $2 da Nmin+par_number+2, ec....) valore di par1, $2 dal valore di par2, ecc...) separatore: La stringa da inserire tra ogni valore congiunzione: La stringa da inserire invece di separatore tra l'ultimo e il penultimo valore. Se non precisato viene usato il valore di separatore pre: eventuale stringa che precede l'unione delle stringhe post: eventuale stringa che segue l'unione delle stringhe lista: se valorizzata a: 'puntata' imposta i parametri per una lista puntata 'ordinata' imposta i aprametri per una lista ordinata 'infobox' imposta l'unione come una lista, eccetto che nel caso ci sia solo un elemento Se lista è valorizzata separatore/congiunzione/pre/post sono ignorati, salvo il caso di 'infobox' e la lista contenga solo un elemento. nmax = indice massimo a cui arrivare con i parametri (se non precisato illimitato) nobbligatori = l'indice minimo che deve essere valutato anche in presenza di buchi nella sequenza (comunque l'indice massimo che viene valutato è nmax) baseIndex = valore del primo parametro posizionale da cui cominciare a leggere (default = 1)]]functionstr.listtostring(frame)localbase_args=frame.argslocalparams={}ifnotbase_argsthenreturnstr._error('Lista parametri vuota')end-- carico la lista dei parametrilocalbase_index=tonumber(base_args.base_index)or1localpar_number=tonumber(base_args.par_number)or1localNmax=tonumber(base_args.nmax)or0localNobbligatori=tonumber(base_args.nobbligatori)orbase_index-1--carico il messaggiolocalmessage=Message(base_args.msgor'$1')elements={}-- carico gli altri parametri di formattazionelocalindex=base_indexlocalargs=frame:getParent().args-- elaboro i valori successivilocalfound=truewhiletruedoifNmax>0andindex>Nmaxthenbreakendmessage:reset_values()found=falsefori=index,index+par_number-1domessage:add_value(args[i]or'')ifargs[i]thenfound=trueendendiffoundthenelements[#elements+1]=message:text()elseifindex>Nobbligatorithenbreakendindex=index+par_numberendif#elements==0thenreturn''end-- carico separatori, congiunzione, pre e postazionelocalpre,post,separatore,congiunzione='','','',''locallista=base_args.listaor''iflista=='puntata'or(lista=='infobox'and#elements>1)thenpre='<UL><LI>'post='</LI>\n</UL>'separatore='</LI>\n<LI>'congiunzione=separatoreelseiflista=='ordinata'thenpre='<OL><LI>'post='</LI>\n</OL>'separatore='</LI>\n<LI>'congiunzione=separatoreelsepre=base_args.preor''post=base_args.postor''separatore=base_args.separatoreor''congiunzione=base_args.congiunzioneorseparatoreendreturnpre..mw.text.listToText(elements,separatore,congiunzione)..postend--[[Funzione di aiuto che popola la lista di argomenti, dato che l'utente può voler utilizzare siaparametri nominati che non nominati. Questo è rilevante perchè gli spazi iniziali inizialie finali dei parametri nominati sono eliminati, mentre quelli dei parametri non nominatinon lo sono. Secondo l'applicazione si potrebbe a volte conservare o rimuovere gli spazi.]]functionstr._getParameters(frame_args,arg_list)localnew_args={};localindex=1;localvalue;fori,arginipairs(arg_list)dovalue=frame_args[arg]ifvalue==nilthenvalue=frame_args[index];index=index+1;endnew_args[arg]=value;endreturnnew_args;end--[[Funzione di appoggio per gestire i messaggi di errore.]]functionstr._error(error_str)localframe=mw.getCurrentFrame();localerror_category=frame.args.error_categoryor'Errori riportati dal modulo String';localignore_errors=frame.args.ignore_errorsorfalse;localno_category=frame.args.no_categoryorfalse;ifstr._getBoolean(ignore_errors)thenreturn'';endlocalerror_str='<strong class="error">Errore nel modulo String: '..error_str..'</strong>';iferror_category~=''andnotstr._getBoolean(no_category)thenerror_str='[[Categoria:'..error_category..']]'..error_str;endreturnerror_str;end--[[Funzione di appoggio per interpretare le stringhe come valori booleane]]functionstr._getBoolean(boolean_str)localboolean_value;iftype(boolean_str)=='string'thenboolean_str=boolean_str:lower();ifboolean_str=='false'orboolean_str=='no'orboolean_str=='0'orbooleean_str=='falso'orboolean_str==''thenboolean_value=false;elseboolean_value=true;endelseiftype(boolean_str)=='boolean'thenboolean_value=boolean_str;elseerror('Nessun valore booleano trovato');endreturnboolean_valueend--[[Funzione di appoggio per aggiungere un carattere di escape a tutti i caratteri speciali,così da trattare una stringa come testo normale e non come pattern di Lua.]]functionstr._escapePattern(pattern_str)returnmw.ustring.gsub(pattern_str,"([%(%)%.%%%+%-%*%?%[%^%$%]])","%%%1");endreturnstr-- Version history:-- 29/3/2013 traduzione iniziale da en:module:String versione 540627185 del 26 febbraio 2013-- 07/05/2013 aggiunta funzione rep da en:module:String versione 552254999 del 26 aprile 2013-- 19/08/2013 aggiunta funzione arraytostring