Module:String2

Uit Wiki Raamsdonks Erfgoed

--[[
    Enkele functies voor strings van de Russische wikipedia
]]
local M = {
    bs=function(f)-- eerste parameter voor het begin van de tweede parameter (of tot het einde, als deze niet wordt aangetroffen)
        return mw.ustring.sub(f.args[1], 1, (mw.ustring.find(f.args[1],f.args[2],tonumber(f.args[3] or 1),true) or 0)-1)
    end;
    as=function(f)-- eerste parameter na het starten van de tweede parameter
        return mw.ustring.sub(f.args[1], (mw.ustring.find(f.args[1],f.args[2],1,true) or 0)+1)
    end;
    Tr=function(s,f,t,cf,df,sf)-- transliteratie van de eerste parameter door de symbolen uit de tweede parameter te vervangen door symbolen uit de derde parameter.
     -- Afzonderlijke parameters kunnen worden gebruikt om e indicatoren c, d en s door te geven, zoals in Perl;  de vervangende tekens werken niet, alleen aan de linkerkant
     -- (dwz het koppelteken moet als eerste of als laatste worden doorgegeven).  Het tweede resultaat is het aantal vervangen tekens.
        local r, l, l2 = {}, mw.ustring.len(f), mw.ustring.len(t);
        for i = 1, l do
            r[mw.ustring.sub(f,i,i)] = i<=l2 and mw.ustring.sub(t,i,i) or df and '' or mw.ustring.sub(t,l2,l2)
        end
        local n2=0;
        local res, n = mw.ustring.gsub(
            s,
            ('[%s%s]%s'):format(
                cf and '^' or '',
                f:gsub('%','%%'):gsub(']','%]'):gsub('^%^','%^'),
                sf and '+' or ''
            ),
            sf and function(cc)
                n2 = n2+mw.ustring.len(cc)-1;
                return mw.ustring.gsub(cc,'.',r)
            end or r
        )
        return res, n+n2
    end;
   -- tr = function(f) return (M.Tr(f.args[1],f.args[2],f.args[3],f.args['c'],f.args['d'],f.args['s'])) end;-- translitereren
   -- trс = function(f) return ({M.Tr(f.args[1],f.args[2],f.args[3],f.args['c'],f.args['d'],f.args['s'])})[2] end;-- tel de symbolen
    Trg = function(s,t,f,fi)-- Vervangt reeksen van willekeurige lengte (indien met fi; hiermee houdt het register geen rekening).
    	-- Prioriteit: op volgorde van de tabellen.
        for n,p in ipairs(t) do
            t[n] = {fi and mw.ustring.upper(p) or p,mw.ustring.len(p)}
        end
        local r,i,l,N = {},1,mw.ustring.len(s),0
        while i<=l do
            (function()
                for n,p in ipairs(t) do
                    if ( fi and mw.ustring.upper(mw.ustring.sub(s,i,i+p[2]-1)) or mw.ustring.sub(s,i,i+p[2]-1) ) == p[1] then
                        table.insert(r,f[n]);
                        i = i+p[2]; N=N+1;
                        return
                    end
                end
                table.insert(r,mw.ustring.sub(s,i,i));
                i=i+1;
                return
            end)()
        end
        return table.concat(r),N
    end;
    trg = function(frame)--Werkt met numerieke argumenten van het betreffende sjabloon, als u wordt gedefinieerd, anders met zijn eigen argumenten.
        --  Vervangt het eerste argument met de argumenten 2, 4, 6 ... met argumenten 3, 5, 7...
        local tf, t, f, i= frame.args['u'] and frame.getParent() or f, {}, {}, 1;
        while tf.args[2*i] do t[tf.args[2*i]]=tf.args[2*i+1] or '' end
        return ( M.Trg(tf.args[1],t,f,(frame.args['i'] or '')~='') )
    end;
    join = function (f) --verenigt de genummerde argumenten van het aangeroepen sjabloon
    -- van from of 1 naar to of het eerste ontbrekende
    -- middels de eerste parameter invoke. Het laatste element kan op een andere wijze worden verenigd door een tweede parameter op te geven.
    -- Standaard ',' & 'en'
    -- Als de derde parameter invoke — "s" is, worden regels bestaande uit spaties genegeerd; bij "_" worden lege regels genegeerd
    	local t, tf, i = {}, f:getParent(), tonumber(f.args.from) or 1
    	local k,j,m = tonumber(f.args.to),i,f.args[3]
    	while k and i<=k or tf.args[i] do
    		if (
    			({
    				['_']=function(s)return s~=''end;
    				['s']=function(s)return not tostring(s):match("^%s*$")end
    			})[m] or function() return true end
    		)(tf.args[i]) then
    			t[j]=tf.args[i];
    			j=j+1
    		end;
    		i=i+1
    	end
    	return mw.text.listToText(t,f.args[1],f.args[2] or f.args[1])
	end
}

function M.formatRound(frame) -- maakt een getal op middels order, voor de tekens na het decimaalteken.
 		
	return string.format("%0."..frame.args[2].."f",tonumber(frame.args[1]));
 	
end

-- als de string s een getal bevat, verhoogt de functie het eerste van die getallen met n, anders retourneert het een lege reeks.
-- Als het nummer begint bij 0, bevat het verhoogde aantal minstens evenveel cijfers als het originele nummer.
function M.increase(s, n) 
    local a,b,c = string.match(s, "([^0-9]*)([0-9]+)(.*)")
    if b==nil then return s end
    local num = tonumber(b) + n
    if b:sub(1,1)=='0' 
    	then b = string.format("%0"..b:len().."d", num)
		else b=num
	end
    return a .. b .. c
end
return M