Mòdulu:String

La ducumintazzioni di stu mòdulu si pò criari nta Mòdulu:String/doc

--[[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]]local str = {}--[[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.]]function str.len( frame )    local new_args = str._getParameters( frame.args, {'s'} );    local s = new_args['s'] or '';    return mw.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.]]function str.sub( frame )    local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } );    local s = new_args['s'] or '';    local i = tonumber( new_args['i'] ) or 1;    local j = tonumber( new_args['j'] ) or -1;    local len = mw.ustring.len( s );    -- Convert negatives for range checking    if i < 0 then        i = len + i + 1;    end    if j < 0 then        j = len + j + 1;    end    if i > len or j > len or i < 1 or j < 1 then        return str._error( 'Indici fuori dagli estremi della stringa' );    end    if j < i then        return str._error( 'Indici in ordine sbagliato' );    end    return mw.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.]]function str.sublength( frame )    local i = tonumber( frame.args.i ) or 0    local len = tonumber( frame.args.len )    return mw.ustring.sub( frame.args.s, i + 1, len and ( 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.]]function str.match(frame)    return str._match(frame.args)end--[[Entry point per chiamata diretta da un modulo]]function str._match( args )    local new_args = str._getParameters( args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} );    local s = new_args['s'] or '';    local start = tonumber( new_args['start'] ) or 1;    local plain_flag = str._getBoolean( new_args['plain'] or false );    local pattern = new_args['pattern'] or '';    local match_index = math.floor( tonumber(new_args['match']) or 1 );    local nomatch = new_args['nomatch'];    if s == '' then        return nomatch or str._error( 'La stringa in cui cercare è vuota' );    end    if pattern == '' then        return nomatch or str._error( 'La stringa o pattern da cercare è vuota' );    end    if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then        return nomatch or str._error( 'La posizione iniziale richiesta è fuori dagli estremi della stringa' );    end    if match_index == 0 then        return nomatch or str._error( 'Match index è nullo' );    end    if plain_flag then        pattern = str._escapePattern( pattern );    end    local result    if match_index == 1 then        -- Il caso più semplice, trova la prima corrispondenza        result = mw.ustring.match( s, pattern, start )    else        if start > 1 then            s = mw.ustring.sub( s, start );        end        local iterator = mw.ustring.gmatch(s, pattern);        if match_index > 0 then            -- Ricerca in avanti            for w in iterator do                match_index = match_index - 1;                if match_index == 0 then                    result = w;                    break;                end            end        else            -- Ricerca all'indietro deve estrarre tutte le corrispondenze            local result_table = {};            local count = 1;            for w in iterator do                result_table[count] = w;                count = count + 1;            end            result = result_table[ count + match_index ];        end    end    if result == nil then        if nomatch == nil then            return str._error( 'Corrispondenza non trovata' );        else            return nomatch;        end    else        return result;    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.]]function str.pos( frame )    local new_args = str._getParameters( frame.args, {'target', 'pos'} );    local target_str = new_args['target'] or '';    local pos = tonumber( new_args['pos'] ) or 0;    if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then        return str._error( 'Indice della stringa fuori dagli estremi' );    end    return mw.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"]]function str.str_find( frame )    local new_args = str._getParameters( frame.args, {'source', 'target'} );    local source_str = new_args['source'] or '';    local target_str = new_args['target'] or '';    if target_str == '' then        return 1;    end    local start = mw.ustring.find( source_str, target_str, 1, true )    if start == nil then        start = -1    end    return startend--[[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.]]function str.find( frame )    local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } );    local source_str = new_args['source'] or '';    local pattern = new_args['target'] or '';    local start_pos = tonumber(new_args['start']) or 1;    local plain = new_args['plain'] or true;    if source_str == '' or pattern == '' then        return 0;    end    plain = str._getBoolean( plain );    local start = mw.ustring.find( source_str, pattern, start_pos, plain )    if start == nil then        start = 0    end    return startend--[[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]]function str.replace( frame )    local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } );    local source_str = new_args['source'] or '';    local pattern = new_args['pattern'] or '';    local replace = new_args['replace'] or '';    local count = tonumber( new_args['count'] );    local plain = new_args['plain'] or true;    if source_str == '' or pattern == '' then        return source_str;    end    plain = str._getBoolean( plain );    if plain then        pattern = str._escapePattern( pattern );        replace = mw.ustring.gsub( replace, "%%", "%%%%" ); --Only need to escape replacement sequences.    end    local result;    if count ~= nil then        result = mw.ustring.gsub( source_str, pattern, replace, count );    else        result = mw.ustring.gsub( source_str, pattern, replace );    end    return result;end--[[    Funzione per utilizzare string.rep in un template.]]function str.rep( frame )    local repetitions = tonumber( frame.args[2] )    if not repetitions then        if frame.args[2] == '' then -- se il secondo parametro è una stringa nulla ritorno una stringa nulla            return ''        else            return str._error( 'la funzione rep si aspetta un secondo parametro con il numero di ripetizioni, ricevuto "' .. ( frame.args[2] or '' ) .. '"' )        end    end    return mw.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]]function str.decode( frame )    local valid_enctype = { QUERY = true, WIKI = true, PATH = true}    local new_args = str._getParameters(frame.args, {'source', 'enctype'})    local source = new_args['source'] or ''    local enc_type = new_args['enctype'] or 'QUERY'    if not valid_enctype[enc_type] then        enc_type = 'QUERY'    end    return mw.uri.decode(source, enc_type)end--[[    Funzione per semplificare stringhe con diacritici]]function str.collate( frame )    local collation = {         {'[áàăắằẵẳâấầẫẩǎåǻäǟãȧǡąāảȁȃạặậḁⱥᶏᴂæɐᶐɒə]', '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'},    }    local new_args = str._getParameters(frame.args, {'source'})    local source = new_args['source'] or ''    --local source = mw.ustring.toNFC(source)    for _, el in ipairs(collation) do        source = mw.ustring.gsub( source, el[1], el[2])    end    return sourceend--[[    Funzione per estrarre da un titolo la stringa adatta all'ordinamento alfabetico. ]]function str.titolo_alfa(frame)    -- Evito "I", "A", "Die"... che darebbero molte false corrispondenze in lingue diverse    local articoli = {"Il ", "Lo ", "La ", "L'", "Gli ", "Le ", "Un ", "Uno ", "Una ", "Un'", "The ", "An ", "Les ", "El ", "Los ", "Las ", "Der ", "Das "}    local source = frame.args[1]    if not source or source == '' then        source = mw.title.getCurrentTitle().text     end    if not source or source == '' then        return ''    end    source = mw.ustring.gsub(source, ' %(.*%)$', '')    source = str.collate( { args = { source } } )    source = mw.ustring.gsub(source, "^['%(%.¡¿ ]*", '')    for _,article in ipairs(articoli) do        source = mw.ustring.gsub(source, "^(" .. article .. ")(.*)$", "%2, %1")    end    source = mw.ustring.gsub(source, '^%l', mw.ustring.upper)    source = mw.text.trim(source)    return sourceend-- =================================================================-- Classe per gestire i parametri-- =================================================================local Param = {}Param.__index = Paramfunction Param.new(par_name, alt_name)    if  par_name ~= "$index" and not mw.ustring.find(par_name, '#') then par_name = par_name .. '#' end;    return setmetatable({        name = par_name,        base_name = mw.ustring.gsub(par_name, ' ?#', '', 1),        alt = alt_name     }, Param)endfunction Param:get_other_value(args, index)    if self.name == '$index' then        return tostring(index), true    else        return args[mw.ustring.gsub(self.name, '#', tostring(index), 1)] or '', false    endendfunction Param:get_first_value(args, index, base_index)    function value_or_nil (s)        if s and s ~= '' then return s end        return nil    end    if self.name == '$index' then        return tostring(index), true    end    if index == base_index then        return value_or_nil(args[mw.ustring.gsub(self.name, '#', tostring(index), 1)]) or               value_or_nil(args[self.base_name]) or value_or_nil(args[self.alt]) or '', false    else        return value_or_nil(args[mw.ustring.gsub(self.name, '#', tostring(index), 1)]) or               value_or_nil(args[self.alt]) or '', false    endendsetmetatable(Param, { __call = function(_, ...) return Param.new(...) end })-- =================================================================-- fine dichiarazione classe per parametro-- =================================================================-- =================================================================-- Classe per gestire il messaggio    -- =================================================================local Message = {}Message.__index = Messagefunction Message.new(msg)    -- converto parentesi graffe che sono state precedute da "\"    msg = mw.ustring.gsub(msg, '\\{', '{')    msg = mw.ustring.gsub(msg, '\\}', '}')    local frame = mw.getCurrentFrame():getParent() or mw.getCurrentFrame()    return setmetatable({        msg =  msg,        values = {},        frame = frame,     }, Message)endfunction Message:reset_values()    self.values = {}endfunction Message:add_value(value)    self.values[#self.values+1] = valueendfunction Message:text()    return self.frame:preprocess(mw.message.newRawMessage(self.msg, self.values):plain())endsetmetatable(Message, { __call = function(_, ...) return Message.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 '&nbsp')    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 }}]]function str.arraytostring(frame)    local base_args = frame.args    local params = {}    if not base_args then return str._error('Lista parametri vuota') end    -- carico la lista dei parametri    local index = 1    while true do        local par_name = base_args['par' .. index] or (index == 1 and base_args['par']) or ''        if par_name == '' then break end        --carico eventuale nome alternativo per il primo parametro        local alt_name = base_args['altpar' .. index] or (index == 1 and base_args['altpar']) or nil        params[index] = Param(par_name, alt_name)        index = index + 1    end    --carico il messaggio    local msg = base_args.msg or '$1'    --if msg == '' then return str._error('Manca il messaggio da riprodurre.') end    local message = Message(msg)    elements = {}    -- carico gli altri parametri di formattazione    local Nmax = tonumber(base_args.Nmax) or tonumber(base_args.nmax) or 0    local base_index = tonumber(base_args.baseindex) or tonumber(base_args.baseIndex) or 1    local index = tonumber(base_args.Nmin) or tonumber(base_args.nmin) or base_index    local Nobbligatori = tonumber(base_args.Nobbligatori) or tonumber(base_args.nobbligatori) or base_index-1    local indentazione = base_args.indentazione or nil    local args = frame:getParent().args    -- estraggo il primo valore    local found = false    for i, param in ipairs(params) do        local v, is_index = param:get_first_value(args, index, base_index)        if (not(is_index) or base_index<=Nobbligatori) and v ~= '' then found = true end        message:add_value(mw.text.trim(v))    end    if found then        elements[#elements+1] = message:text()        index = index + 1    end    -- elaboro i valori successivi    while true do        if Nmax > 0 and index > Nmax then break end        message:reset_values()        found = false        for i, param in ipairs(params) do            local v, is_index = param:get_other_value(args, index)            if (not(is_index) or index<=Nobbligatori) and v ~= '' then found = true end            message:add_value(mw.text.trim(v))        end        if found then            elements[#elements+1] = message:text()        elseif index >= Nobbligatori then            break        end        index = index + 1    end    if #elements == 0 then return '' end    -- carico separatori, congiunzione, pre e postazione    local pre, post, separatore, congiunzione, indent = '', '', '', '', ''    local lista = base_args.lista or ''    if lista == 'puntata' or (lista =='infobox' and #elements >1) then        pre = '<UL><LI>'        post = '</LI>\n</UL>'        separatore = '</LI>\n<LI>'        congiunzione = separatore    elseif lista == 'ordinata' then        pre = '<OL><LI>'        post = '</LI>\n</OL>'        separatore = '</LI>\n<LI>'        congiunzione = separatore    else        pre = base_args.pre or ''        post = base_args.post or ''        separatore = base_args.separatore or ''        congiunzione = base_args.congiunzione or separatore    end    if indentazione then        local current_indentazione = indentazione        for i, msg in ipairs(elements) do            elements[i] = current_indentazione .. elements[i]            current_indentazione = current_indentazione .. indentazione         end    end    return pre .. 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)]]function str.listtostring(frame)    local base_args = frame.args    local params = {}    if not base_args then return str._error('Lista parametri vuota') end    -- carico la lista dei parametri    local base_index = tonumber(base_args.base_index) or 1    local par_number = tonumber(base_args.par_number) or 1    local Nmax = tonumber(base_args.nmax) or 0    local Nobbligatori = tonumber(base_args.nobbligatori) or base_index-1    --carico il messaggio    local message = Message(base_args.msg or '$1')    elements = {}    -- carico gli altri parametri di formattazione    local index = base_index    local args = frame:getParent().args      -- elaboro i valori successivi    local found = true    while true do        if Nmax > 0 and index > Nmax then break end        message:reset_values()        found = false        for i = index, index+par_number-1 do            message:add_value(args[i] or '')            if args[i] then                found = true            end        end        if found then             elements[#elements+1] = message:text()        elseif index > Nobbligatori then            break        end        index = index + par_number    end    if #elements == 0 then return '' end    -- carico separatori, congiunzione, pre e postazione    local pre, post, separatore, congiunzione = '', '', '', ''    local lista = base_args.lista or ''    if lista == 'puntata' or (lista =='infobox' and #elements >1) then        pre = '<UL><LI>'        post = '</LI>\n</UL>'        separatore = '</LI>\n<LI>'        congiunzione = separatore    elseif lista == 'ordinata' then        pre = '<OL><LI>'        post = '</LI>\n</OL>'        separatore = '</LI>\n<LI>'        congiunzione = separatore    else        pre = base_args.pre or ''        post = base_args.post or ''        separatore = base_args.separatore or ''        congiunzione = base_args.congiunzione or separatore    end    return pre .. 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.]]function str._getParameters( frame_args, arg_list )    local new_args = {};    local index = 1;    local value;    for i,arg in ipairs( arg_list ) do        value = frame_args[arg]        if value == nil then            value = frame_args[index];            index = index + 1;        end        new_args[arg] = value;    end    return new_args;end--[[Funzione di appoggio per gestire i messaggi di errore.]]function str._error( error_str )    local frame = mw.getCurrentFrame();    local error_category = frame.args.error_category or 'Errori riportati dal modulo String';    local ignore_errors = frame.args.ignore_errors or false;    local no_category = frame.args.no_category or false;    if str._getBoolean(ignore_errors) then        return '';    end    local error_str = '<strong class="error">Errore nel modulo String: ' .. error_str .. '</strong>';    if error_category ~= '' and not str._getBoolean( no_category ) then        error_str = '[[Categoria:' .. error_category .. ']]' .. error_str;    end    return error_str;end--[[Funzione di appoggio per interpretare le stringhe come valori booleane]]function str._getBoolean( boolean_str )    local boolean_value;    if type( boolean_str ) == 'string' then        boolean_str = boolean_str:lower();        if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'                or booleean_str == 'falso' or boolean_str == '' then            boolean_value = false;        else            boolean_value = true;        end    elseif type( boolean_str ) == 'boolean' then        boolean_value = boolean_str;    else        error('Nessun valore booleano trovato' );    end    return boolean_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.]]function str._escapePattern( pattern_str )    return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" );endreturn str-- 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