<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://de.wikijournal.org/w-wiki/index.php?action=history&amp;feed=atom&amp;title=Modul%3APageUtil</id>
	<title>Modul:PageUtil - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://de.wikijournal.org/w-wiki/index.php?action=history&amp;feed=atom&amp;title=Modul%3APageUtil"/>
	<link rel="alternate" type="text/html" href="https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;action=history"/>
	<updated>2026-04-19T08:20:13Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in WikiJournal</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=277&amp;oldid=prev</id>
		<title>Philip: 1 Version importiert</title>
		<link rel="alternate" type="text/html" href="https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=277&amp;oldid=prev"/>
		<updated>2025-02-05T06:57:49Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&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: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 5. Februar 2025, 09:57 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>Philip</name></author>
	</entry>
	<entry>
		<id>https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=276&amp;oldid=prev</id>
		<title>__de&gt;PerfektesChaos: 2024-08-20</title>
		<link rel="alternate" type="text/html" href="https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=276&amp;oldid=prev"/>
		<updated>2024-08-29T12:41:41Z</updated>

		<summary type="html">&lt;p&gt;2024-08-20&lt;/p&gt;
&lt;a href=&quot;https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;amp;diff=276&amp;amp;oldid=168&quot;&gt;Änderungen zeigen&lt;/a&gt;</summary>
		<author><name>__de&gt;PerfektesChaos</name></author>
	</entry>
	<entry>
		<id>https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=168&amp;oldid=prev</id>
		<title>Admin: Die Seite wurde neu angelegt: „local PageUtil = { suite  = &quot;PageUtil&quot;,                    serial = &quot;2018-10-19&quot;,                    item   = 0 } --[=[ PageUtil ]=]    PageUtil.maxPages = 200    local function fault( alert, frame )     -- Format message with class=&quot;error&quot;     --     alert  -- string, with message     --     frame  -- object, if known     -- Returns message with markup     local scream = alert     if frame then         scream = string.format( &quot;%s * %s&quot;, frame:getTitle(),…“</title>
		<link rel="alternate" type="text/html" href="https://de.wikijournal.org/w-wiki/index.php?title=Modul:PageUtil&amp;diff=168&amp;oldid=prev"/>
		<updated>2023-03-24T08:11:35Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „local PageUtil = { suite  = &amp;quot;PageUtil&amp;quot;,                    serial = &amp;quot;2018-10-19&amp;quot;,                    item   = 0 } --[=[ PageUtil ]=]    PageUtil.maxPages = 200    local function fault( alert, frame )     -- Format message with class=&amp;quot;error&amp;quot;     --     alert  -- string, with message     --     frame  -- object, if known     -- Returns message with markup     local scream = alert     if frame then         scream = string.format( &amp;quot;%s * %s&amp;quot;, frame:getTitle(),…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local PageUtil = { suite  = &amp;quot;PageUtil&amp;quot;,&lt;br /&gt;
                   serial = &amp;quot;2018-10-19&amp;quot;,&lt;br /&gt;
                   item   = 0 }&lt;br /&gt;
--[=[&lt;br /&gt;
PageUtil&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PageUtil.maxPages = 200&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( alert, frame )&lt;br /&gt;
    -- Format message with class=&amp;quot;error&amp;quot;&lt;br /&gt;
    --     alert  -- string, with message&lt;br /&gt;
    --     frame  -- object, if known&lt;br /&gt;
    -- Returns message with markup&lt;br /&gt;
    local scream = alert&lt;br /&gt;
    if frame then&lt;br /&gt;
        scream = string.format( &amp;quot;%s * %s&amp;quot;, frame:getTitle(), scream )&lt;br /&gt;
    end&lt;br /&gt;
    return tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                            :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                            :wikitext( scream ) )&lt;br /&gt;
end -- fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flat( adjust, assembly )&lt;br /&gt;
    -- Replace links to pages by inner links&lt;br /&gt;
    --     adjust    -- string, with text&lt;br /&gt;
    --     assembly  -- table, with page infos&lt;br /&gt;
    -- Returns adjusted string&lt;br /&gt;
    local r = adjust&lt;br /&gt;
    local seek, shift, source, subst&lt;br /&gt;
    for k, v in pairs( assembly ) do&lt;br /&gt;
        source = v[ 1 ]&lt;br /&gt;
        shift  = v[ 2 ]&lt;br /&gt;
        source = &amp;quot;:?&amp;quot; .. source:gsub( &amp;quot; &amp;quot;, &amp;quot;[_ ]+&amp;quot; )&lt;br /&gt;
                               :gsub( &amp;quot;[%.%(%)%*%?%+%-]&amp;quot;, &amp;quot;%1&amp;quot; )&lt;br /&gt;
                      .. &amp;quot;%s*&amp;quot;&lt;br /&gt;
        seek   = &amp;quot;%[%[%s*&amp;quot; .. source .. &amp;quot;(#[^%]]*%]%])&amp;quot;&lt;br /&gt;
        subst  = &amp;quot;[[%1&amp;quot;&lt;br /&gt;
        r = r:gsub( seek, subst )&lt;br /&gt;
        seek  = &amp;quot;%[%[%s*&amp;quot; .. source .. &amp;quot;(%|[^%]]*%]%])&amp;quot;&lt;br /&gt;
        subst = &amp;quot;[[#&amp;quot; .. shift .. &amp;quot;%1&amp;quot;&lt;br /&gt;
        r = r:gsub( seek, subst )&lt;br /&gt;
        seek  = &amp;quot;%[%[%s*(&amp;quot; .. source .. &amp;quot;%]%])&amp;quot;&lt;br /&gt;
        subst = &amp;quot;[[#&amp;quot; .. shift .. &amp;quot;|%1&amp;quot;&lt;br /&gt;
        r = r:gsub( seek, subst )&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    return r&lt;br /&gt;
end -- flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fraction( access, frame )&lt;br /&gt;
    -- Retrieve text from section&lt;br /&gt;
    --     access  -- string, with request&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    -- Returns content, or false&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     mw.title.new() .exists&lt;br /&gt;
    local r&lt;br /&gt;
    local seek = &amp;quot;^(#lstx?):%s*%[%[([^%[|%]\n]+)%]%]%s*(%S.*)%s*$&amp;quot;&lt;br /&gt;
    local scope, source, section = access:match( seek )&lt;br /&gt;
    if source then&lt;br /&gt;
        local page = mw.title.new( source )&lt;br /&gt;
        source = page.prefixedText&lt;br /&gt;
        if page.exists then&lt;br /&gt;
            section = mw.text.trim( section )&lt;br /&gt;
            if section ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                r = frame:callParserFunction{ name = scope,&lt;br /&gt;
                                              args = { source,&lt;br /&gt;
                                                       section } }&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = tostring( mw.html.create( &amp;quot;div&amp;quot; )&lt;br /&gt;
                                 :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                                 :wikitext( source ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fraction()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function full( access, frame, alias, assembly )&lt;br /&gt;
    -- Retrieve text from page&lt;br /&gt;
    --     access    -- string, with page name&lt;br /&gt;
    --     frame     -- object&lt;br /&gt;
    --     alias     -- number, unique&lt;br /&gt;
    --     assembly  -- table, with page infos&lt;br /&gt;
    -- Returns string with content, or nil&lt;br /&gt;
    -- Uses:&lt;br /&gt;
    --     mw.title.new() .exists&lt;br /&gt;
    local page = mw.title.new( access )&lt;br /&gt;
    local r&lt;br /&gt;
    if page then&lt;br /&gt;
        if page.exists then&lt;br /&gt;
            local source  = page.prefixedText&lt;br /&gt;
            local segment = string.format( &amp;quot;PageUtilMerge-%d&amp;quot;, alias )&lt;br /&gt;
            local seed&lt;br /&gt;
            if page.namespace == 0 then&lt;br /&gt;
                seed = &amp;quot;:&amp;quot; .. source&lt;br /&gt;
            else&lt;br /&gt;
                seed = source&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;%s\n%s&amp;quot;,&lt;br /&gt;
                               tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                                :attr( &amp;quot;id&amp;quot;, segment ) ),&lt;br /&gt;
                               frame:expandTemplate( { title = seed } ) )&lt;br /&gt;
            table.insert( assembly,  { source, segment } )&lt;br /&gt;
        else&lt;br /&gt;
            r = tostring( mw.html.create( &amp;quot;div&amp;quot; )&lt;br /&gt;
                                 :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                                 :wikitext( page.prefixedText ) )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = string.format( &amp;quot;%s &amp;#039;%s&amp;#039;&amp;quot;, &amp;quot;Unknown page&amp;quot;, access )&lt;br /&gt;
        r = tostring( mw.html.create( &amp;quot;div&amp;quot; )&lt;br /&gt;
                             :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                             :wikitext( r ) )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- full()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PageUtil.failsafe = function ( assert )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     assert  -- string, with required version or &amp;quot;wikidata&amp;quot;,&lt;br /&gt;
    --                or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string with appropriate version, or false&lt;br /&gt;
    local since = assert&lt;br /&gt;
    local r&lt;br /&gt;
    if since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = PageUtil.item&lt;br /&gt;
        since = false&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local ent = mw.wikibase.getEntity( string.format( &amp;quot;Q%d&amp;quot;,&lt;br /&gt;
                                                              item ) )&lt;br /&gt;
            if type( ent ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local vsn = ent:formatPropertyValues( &amp;quot;P348&amp;quot; )&lt;br /&gt;
                if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                   type( vsn.value ) == &amp;quot;string&amp;quot; and&lt;br /&gt;
                   vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    r = vsn.value&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        if not since  or  since &amp;lt;= PageUtil.serial then&lt;br /&gt;
            r = PageUtil.serial&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- PageUtil.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PageUtil.getProtection = function ( access, action )&lt;br /&gt;
    -- Retrieve protection&lt;br /&gt;
    --     access  -- string or title or nil, with page, default: current&lt;br /&gt;
    --     action  -- string or nil, with action, default: edit&lt;br /&gt;
    -- Returns number: One of: 0, 0.5, 0.75, 1&lt;br /&gt;
    local t = type( access )&lt;br /&gt;
    local r = 0&lt;br /&gt;
    local p&lt;br /&gt;
    if t == &amp;quot;string&amp;quot; then&lt;br /&gt;
        t = mw.title.new( access )&lt;br /&gt;
    elseif t == &amp;quot;table&amp;quot; then&lt;br /&gt;
        t = access&lt;br /&gt;
    else&lt;br /&gt;
        t = mw.title.getCurrentTitle()&lt;br /&gt;
    end&lt;br /&gt;
    p = t.protectionLevels&lt;br /&gt;
    if type( p ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local s&lt;br /&gt;
        if type( action ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            s = mw.text.trim( action )&lt;br /&gt;
            if s == &amp;quot;&amp;quot; then&lt;br /&gt;
                s = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        p = p[ s or &amp;quot;edit&amp;quot; ]&lt;br /&gt;
        if type( p ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            for k, v in pairs( p ) do&lt;br /&gt;
                if v == &amp;quot;autoconfirmed&amp;quot; then&lt;br /&gt;
                    r = 0.5&lt;br /&gt;
                elseif v == &amp;quot;editeditorprotected&amp;quot; then&lt;br /&gt;
                    r = 0.75&lt;br /&gt;
                elseif v == &amp;quot;sysop&amp;quot; then&lt;br /&gt;
                    r = 1&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- PageUtil.getProtection()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
PageUtil.merge = function ( args, frame )&lt;br /&gt;
    -- Retrieve text&lt;br /&gt;
    --     args   -- table, with request&lt;br /&gt;
    --     frame  -- object, if available&lt;br /&gt;
    -- Returns string, with content&lt;br /&gt;
    local max = 0&lt;br /&gt;
    local r   = &amp;quot;&amp;quot;&lt;br /&gt;
    for k, v in pairs( args ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot;  and&lt;br /&gt;
           k &amp;gt; max then&lt;br /&gt;
            max = k&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if max &amp;gt; 0 then&lt;br /&gt;
        local n     = 0&lt;br /&gt;
        local pages = {  { mw.title.getCurrentTitle().prefixedText,&lt;br /&gt;
                           &amp;quot;&amp;quot; }  }&lt;br /&gt;
        local mode, s, section, swallow&lt;br /&gt;
        if not frame then&lt;br /&gt;
            frame = mw.getCurrentFrame()&lt;br /&gt;
        end&lt;br /&gt;
        for i = 1, max do&lt;br /&gt;
            s = args[ i ]&lt;br /&gt;
            if s then&lt;br /&gt;
                swallow = s:match( &amp;quot;^%s*(#lstx?:[^\n]*%S)%s*$&amp;quot; )&lt;br /&gt;
                if swallow then&lt;br /&gt;
                    s = fraction( swallow, frame )&lt;br /&gt;
                    n = n + 1&lt;br /&gt;
                else&lt;br /&gt;
                    swallow = s:match( &amp;quot;^%s*%[%[([^%[|%]\n]+)%]%]%s*$&amp;quot; )&lt;br /&gt;
                    if swallow then&lt;br /&gt;
                        s = full( swallow, frame, i, pages )&lt;br /&gt;
                        n = n + 1&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if s then&lt;br /&gt;
                    r = r .. mw.text.trim( s )&lt;br /&gt;
                end&lt;br /&gt;
                if n &amp;gt; PageUtil.maxPages then&lt;br /&gt;
                    s = string.format( &amp;quot;&amp;#039;&amp;#039;&amp;#039;Too many pages (max. %d)&amp;#039;&amp;#039;&amp;#039;&amp;quot;,&lt;br /&gt;
                                       PageUtil.maxPages )&lt;br /&gt;
                    r = string.format( &amp;quot;%s\n\n%s&amp;quot;,&lt;br /&gt;
                                       r,&lt;br /&gt;
                                       fault( s, frame ) )&lt;br /&gt;
                    break -- for i&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        r = flat( r, pages )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- .merge()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
p.getProtection = function ( frame )&lt;br /&gt;
    local n = PageUtil.getProtection( frame.args[ 1 ], frame.args[ 2 ] )&lt;br /&gt;
    local t = { [ 0 ]    = &amp;quot;&amp;quot;,&lt;br /&gt;
                [ 0.5 ]  = mw.ustring.char( 189 ),&lt;br /&gt;
                [ 0.75 ] = mw.ustring.char( 190 ),&lt;br /&gt;
                [ 1 ]    = &amp;quot;1&amp;quot; }&lt;br /&gt;
    return t[ n ]&lt;br /&gt;
end -- p.getProtection&lt;br /&gt;
&lt;br /&gt;
function p.isRedirect()&lt;br /&gt;
    return mw.title.getCurrentTitle().isRedirect and &amp;quot;1&amp;quot;  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isRedirect&lt;br /&gt;
&lt;br /&gt;
p.merge = function ( frame )&lt;br /&gt;
    local lucky, r = pcall( PageUtil.merge, frame.args, frame )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        r = fault( r, frame )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.merge&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    -- Versioning interface&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local since&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ]&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return PageUtil.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe()&lt;br /&gt;
&lt;br /&gt;
function p.PageUtil()&lt;br /&gt;
    return PageUtil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>