<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stadtjugendring-oldenburg.de/Modul:Expr/history?feed=atom</id>
	<title>Modul:Expr - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stadtjugendring-oldenburg.de/Modul:Expr/history?feed=atom"/>
	<link rel="alternate" type="text/html" href="https://wiki.stadtjugendring-oldenburg.de/Modul:Expr/history"/>
	<updated>2026-04-29T18:06:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Stadtjugendring Oldenburg</subtitle>
	<generator>MediaWiki 1.44.0-beta</generator>
	<entry>
		<id>https://wiki.stadtjugendring-oldenburg.de/index.php?title=Modul:Expr&amp;diff=438&amp;oldid=prev</id>
		<title>imported&gt;Antonsusi am 24. August 2019 um 11:15 Uhr</title>
		<link rel="alternate" type="text/html" href="https://wiki.stadtjugendring-oldenburg.de/index.php?title=Modul:Expr&amp;diff=438&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;#039;&amp;#039;&amp;quot; .. show .. &amp;quot;&amp;#039;&amp;#039; (&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 &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039;&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 &amp;#039;&amp;#039;);&lt;br /&gt;
		if s == &amp;#039;&amp;#039; then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s==&amp;#039;0&amp;#039; then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s==&amp;#039;false&amp;#039; then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s==&amp;#039;falsch&amp;#039; then&lt;br /&gt;
			b = false;&lt;br /&gt;
		elseif s==&amp;#039;nein&amp;#039; 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>imported&gt;Antonsusi</name></author>
	</entry>
</feed>