
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.freewiki.eu/de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AExpr</id>
	<title>Modul:Expr - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://www.freewiki.eu/de/index.php?action=history&amp;feed=atom&amp;title=Modul%3AExpr"/>
	<link rel="alternate" type="text/html" href="https://www.freewiki.eu/de/index.php?title=Modul:Expr&amp;action=history"/>
	<updated>2026-05-05T08:06:36Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in FreeWiki</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://www.freewiki.eu/de/index.php?title=Modul:Expr&amp;diff=5235&amp;oldid=prev</id>
		<title>Admin: 1 Version importiert</title>
		<link rel="alternate" type="text/html" href="https://www.freewiki.eu/de/index.php?title=Modul:Expr&amp;diff=5235&amp;oldid=prev"/>
		<updated>2020-02-02T18:18:47Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Version vom 2. Februar 2020, 18:18 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;de&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(kein Unterschied)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>https://www.freewiki.eu/de/index.php?title=Modul:Expr&amp;diff=5234&amp;oldid=prev</id>
		<title>te&gt;Antonsusi am 24. August 2019 um 11:15 Uhr</title>
		<link rel="alternate" type="text/html" href="https://www.freewiki.eu/de/index.php?title=Modul:Expr&amp;diff=5234&amp;oldid=prev"/>
		<updated>2019-08-24T11:15:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[ 2016-05-26&lt;br /&gt;
Expr&lt;br /&gt;
* max&lt;br /&gt;
* min&lt;br /&gt;
* TemplateMax&lt;br /&gt;
* TemplateMin&lt;br /&gt;
* booland&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local messagePrefix = &amp;quot;lua-module-Expr-&amp;quot;&lt;br /&gt;
local l10nDef = {}&lt;br /&gt;
l10nDef[ &amp;quot;en&amp;quot; ] = {&lt;br /&gt;
    ErrorExpr  = &amp;quot;Error in mathematical expression, function#parameter&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
l10nDef[ &amp;quot;de&amp;quot; ]  = {&lt;br /&gt;
    ErrorExpr  = &amp;quot;Fehler in mathematischem Ausdruck, Funktion#Parameter&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function factory( say )&lt;br /&gt;
    -- Retrieve localized message string in content language&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     say  -- string; message ID&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Return some message string&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     &amp;gt;  messagePrefix&lt;br /&gt;
    --     &amp;gt;  l10nDef&lt;br /&gt;
    --     mw.language.getContentLanguage()&lt;br /&gt;
    --     mw.message.new()&lt;br /&gt;
    local c = mw.language.getContentLanguage():getCode()&lt;br /&gt;
    local m = mw.message.new( messagePrefix .. say )&lt;br /&gt;
    local r = false&lt;br /&gt;
    if m:isBlank() then&lt;br /&gt;
        local l10n = l10nDef[ c ]&lt;br /&gt;
        if not l10n then&lt;br /&gt;
            l10n = l10nDef[ &amp;quot;en&amp;quot; ]&lt;br /&gt;
        end&lt;br /&gt;
        r = l10n[ say ]&lt;br /&gt;
    else&lt;br /&gt;
        m:inLanguage( c )&lt;br /&gt;
        r = m:plain()&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = &amp;quot;(((&amp;quot; .. say .. &amp;quot;)))&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- factory()&lt;br /&gt;
&lt;br /&gt;
local function eval( source, frame )&lt;br /&gt;
    -- Evaluate expression&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     source  -- string; mathematical expression&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    return frame:callParserFunction( &amp;quot;#expr&amp;quot;, source )&lt;br /&gt;
end -- eval()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function expr( source, frame, show )&lt;br /&gt;
    -- Safe evaluation of presumable expression&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     source  -- string; mathematical expression&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    --     show    -- string; details about source&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     throws error, if expression failed&lt;br /&gt;
    --     returns number with resulting figure&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     factory()&lt;br /&gt;
    local lucky, r = pcall( eval, source, frame )&lt;br /&gt;
    local n = tonumber( r, 10 )&lt;br /&gt;
    if not lucky or n == nil then&lt;br /&gt;
        r = r .. &amp;quot; &amp;quot; .. factory( &amp;quot;ErrorExpr&amp;quot; )&lt;br /&gt;
            .. &amp;quot; ''&amp;quot; .. show .. &amp;quot;'' (&amp;quot; .. source .. &amp;quot;)&amp;quot;&lt;br /&gt;
        error( r, 0 )&lt;br /&gt;
    else&lt;br /&gt;
        r = n&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- expr()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function base62( value )&lt;br /&gt;
    -- Convert number from and to base62 encoding&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     value  -- number or string to be converted&lt;br /&gt;
    --               number: to base62&lt;br /&gt;
    --               string: base62 to number&lt;br /&gt;
    --     Lua limitation at 10^53; larger numbers are less precise&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     returns string, or number, or false&lt;br /&gt;
    local r = false&lt;br /&gt;
    local state = type( value )&lt;br /&gt;
    if state == &amp;quot;number&amp;quot; then&lt;br /&gt;
        local k = math.floor( value )&lt;br /&gt;
        if k == value  and  value &amp;gt; 0 then&lt;br /&gt;
            local m&lt;br /&gt;
            r = &amp;quot;&amp;quot;&lt;br /&gt;
            while k &amp;gt; 0 do&lt;br /&gt;
                m = k % 62&lt;br /&gt;
                k = ( k - m ) / 62&lt;br /&gt;
                if m &amp;gt;= 36 then&lt;br /&gt;
                    m = m + 61&lt;br /&gt;
                elseif m &amp;gt;= 11 then&lt;br /&gt;
                    m = m + 55&lt;br /&gt;
                else&lt;br /&gt;
                    m = m + 48&lt;br /&gt;
                end&lt;br /&gt;
                r = string.char( m ) .. r&lt;br /&gt;
            end&lt;br /&gt;
        elseif value == 0 then&lt;br /&gt;
            r = &amp;quot;0&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    elseif state == &amp;quot;string&amp;quot; then&lt;br /&gt;
        if value:match( &amp;quot;^%w+$&amp;quot; ) then&lt;br /&gt;
            local n = #value&lt;br /&gt;
            local k = 1&lt;br /&gt;
            local c&lt;br /&gt;
            r = 0&lt;br /&gt;
            for i = n, 1, -1 do&lt;br /&gt;
                c = value:byte( i, i )&lt;br /&gt;
                if c &amp;gt;= 48  and  c &amp;lt;= 57 then&lt;br /&gt;
                    c = c - 48&lt;br /&gt;
                elseif c &amp;gt;= 65  and  c &amp;lt;= 90 then&lt;br /&gt;
                    c = c - 55&lt;br /&gt;
                elseif c &amp;gt;= 97  and  c &amp;lt;= 122 then&lt;br /&gt;
                    c = c - 61&lt;br /&gt;
                else    -- How comes?&lt;br /&gt;
                    r = nil&lt;br /&gt;
                    break    -- for i&lt;br /&gt;
                end&lt;br /&gt;
                r = r + c * k&lt;br /&gt;
                k = k * 62&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- base62()&lt;br /&gt;
&lt;br /&gt;
function logicaland(args)&lt;br /&gt;
	local r = true;&lt;br /&gt;
	local k, v, s&lt;br /&gt;
	local b&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		s = mw.text.trim(v)&lt;br /&gt;
		b = (s or '') ~= ''&lt;br /&gt;
		r = r and b&lt;br /&gt;
	end&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function logicalor(args)&lt;br /&gt;
	local r = false;&lt;br /&gt;
	local k, v, s&lt;br /&gt;
	local b&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		s = mw.ustring.lower(mw.text.trim(v) or '');&lt;br /&gt;
		if s == '' then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s=='0' then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s=='false' then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s=='falsch' then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s=='nein' then&lt;br /&gt;
			b = false;&lt;br /&gt;
		else&lt;br /&gt;
			b = true;&lt;br /&gt;
		end&lt;br /&gt;
		if b then&lt;br /&gt;
			r = true;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function minmax( params, frame, low, lazy  )&lt;br /&gt;
    -- Find extremum of unnamed params values&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     params  -- table; like args&lt;br /&gt;
    --                       .minus&lt;br /&gt;
    --                       .zeroBlank&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    --     low     -- true: minimum;  false: maximum&lt;br /&gt;
    --     lazy    -- true: try numeric result;  false: return string&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     throws error, if expression failed&lt;br /&gt;
    --     returns number, or&lt;br /&gt;
    --             string if formatting required, or&lt;br /&gt;
    --             false if no data provided&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     expr()&lt;br /&gt;
    local k, v, n, scope&lt;br /&gt;
    local light  = ( params.minus ~= &amp;quot;-&amp;quot; )&lt;br /&gt;
    local luxury = ( params.minus and light )&lt;br /&gt;
    local c      = mw.ustring.char( 8722 )    -- minus&lt;br /&gt;
    local scan   = &amp;quot;^%s*%-?[0-9]*%.?[0-9]*%s*$&amp;quot;&lt;br /&gt;
    local r      = false&lt;br /&gt;
    for k, v in pairs( params ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
            scope  = type( v )&lt;br /&gt;
            if scope == &amp;quot;string&amp;quot; then&lt;br /&gt;
                if v:match( &amp;quot;^%s*$&amp;quot; ) then&lt;br /&gt;
                    n = false&lt;br /&gt;
                else&lt;br /&gt;
                    if mw.ustring.match( v, c ) then&lt;br /&gt;
                        luxury = light&lt;br /&gt;
                        v      = mw.ustring.gsub( v, c, &amp;quot;-&amp;quot; )&lt;br /&gt;
                    end&lt;br /&gt;
                    if not mw.ustring.match( v, scan ) then&lt;br /&gt;
                        if low then&lt;br /&gt;
                            scope = &amp;quot;min()#&amp;quot;&lt;br /&gt;
                        else&lt;br /&gt;
                            scope = &amp;quot;max()#&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                        scope = scope .. tostring( k )&lt;br /&gt;
                        v     = expr( v, frame, scope )&lt;br /&gt;
                    end&lt;br /&gt;
                    n = tonumber( v )&lt;br /&gt;
                end&lt;br /&gt;
            elseif scope == &amp;quot;number&amp;quot; then&lt;br /&gt;
                n = v&lt;br /&gt;
            else&lt;br /&gt;
                n = false&lt;br /&gt;
            end&lt;br /&gt;
            if n then&lt;br /&gt;
                if r then&lt;br /&gt;
                    if low then&lt;br /&gt;
                        if n &amp;lt; r then&lt;br /&gt;
                            r = n&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        if n &amp;gt; r then&lt;br /&gt;
                            r = n&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = n&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if r then&lt;br /&gt;
        if luxury and r &amp;lt; 0 then&lt;br /&gt;
            r = c .. tostring( -1 * r )&lt;br /&gt;
        elseif not lazy then&lt;br /&gt;
            if r == 0 then&lt;br /&gt;
                if params.zeroBlank then&lt;br /&gt;
                    r = &amp;quot;&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    r = &amp;quot;0&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = tostring( r )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- minmax()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.base62( frame )&lt;br /&gt;
    local r&lt;br /&gt;
    local s = frame.args[ 1 ]&lt;br /&gt;
    if s then&lt;br /&gt;
        local s2 = frame.args[ 2 ]&lt;br /&gt;
        if s2 then&lt;br /&gt;
            s2 = mw.text.trim( s2 )&lt;br /&gt;
        end&lt;br /&gt;
        if s2 == &amp;quot;D2B&amp;quot; then&lt;br /&gt;
            s = tonumber( s )&lt;br /&gt;
        else&lt;br /&gt;
            s = mw.text.trim( s )&lt;br /&gt;
            s2 = false&lt;br /&gt;
        end&lt;br /&gt;
        r = base62( s )&lt;br /&gt;
        if r  and  not s2 then&lt;br /&gt;
            r =  string.format( &amp;quot;%17d&amp;quot;, r )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.max( frame )&lt;br /&gt;
    local lucky, r = pcall( minmax, frame.args, frame, false, false )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.min( frame )&lt;br /&gt;
    local lucky, r = pcall( minmax, frame.args, frame, true, false )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.TemplateMax( frame )&lt;br /&gt;
    return p.max( frame:getParent() )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.TemplateMin( frame )&lt;br /&gt;
    return p.min( frame:getParent() )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.booland(frame)&lt;br /&gt;
	local fr=frame:getParent()&lt;br /&gt;
	return logicaland(fr.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.boolor(frame)&lt;br /&gt;
	local fr=frame:getParent()&lt;br /&gt;
	return logicalor(fr.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.Expr( f, a )&lt;br /&gt;
    local r = false&lt;br /&gt;
    if f == &amp;quot;min&amp;quot;  or  f == &amp;quot;max&amp;quot; then&lt;br /&gt;
        local frame = mw.getCurrentFrame()&lt;br /&gt;
        local low = ( f == &amp;quot;min&amp;quot; )&lt;br /&gt;
        local lucky&lt;br /&gt;
        lucky, r = pcall( minmax, a, frame, low, true )&lt;br /&gt;
    elseif f == &amp;quot;base62&amp;quot; then&lt;br /&gt;
        r = base62( a )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- .Expr()&lt;br /&gt;
&lt;br /&gt;
return p -- Expr&lt;/div&gt;</summary>
		<author><name>te&gt;Antonsusi</name></author>
		
	</entry>
</feed>