<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-CH">
	<id>https://www.muri-gries.ch/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Modul%3AVorlage%3AAnker</id>
	<title>Modul:Vorlage:Anker - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://www.muri-gries.ch/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Modul%3AVorlage%3AAnker"/>
	<link rel="alternate" type="text/html" href="https://www.muri-gries.ch/mediawiki/index.php?title=Modul:Vorlage:Anker&amp;action=history"/>
	<updated>2026-04-19T22:58:38Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Muri</subtitle>
	<generator>MediaWiki 1.35.0</generator>
	<entry>
		<id>https://www.muri-gries.ch/mediawiki/index.php?title=Modul:Vorlage:Anker&amp;diff=52718&amp;oldid=prev</id>
		<title>Beda: 1 Version importiert</title>
		<link rel="alternate" type="text/html" href="https://www.muri-gries.ch/mediawiki/index.php?title=Modul:Vorlage:Anker&amp;diff=52718&amp;oldid=prev"/>
		<updated>2021-03-22T14:44:14Z</updated>

		<summary type="html">&lt;p&gt;1 Version importiert&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left diff-editfont-monospace&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de-CH&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 22. März 2021, 14:44 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;de-CH&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>Beda</name></author>
	</entry>
	<entry>
		<id>https://www.muri-gries.ch/mediawiki/index.php?title=Modul:Vorlage:Anker&amp;diff=52717&amp;oldid=prev</id>
		<title>de&gt;PerfektesChaos: 2020-04-10</title>
		<link rel="alternate" type="text/html" href="https://www.muri-gries.ch/mediawiki/index.php?title=Modul:Vorlage:Anker&amp;diff=52717&amp;oldid=prev"/>
		<updated>2020-04-13T14:28:29Z</updated>

		<summary type="html">&lt;p&gt;2020-04-10&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Anchors = { suite   = &amp;quot;Anchors&amp;quot;,&lt;br /&gt;
                  serial  = &amp;quot;2020-04-10&amp;quot;,&lt;br /&gt;
                  item    = 79414611,&lt;br /&gt;
                  globals = { Multilingual = 47541920,&lt;br /&gt;
                              TemplUtl     = 52364930 }&lt;br /&gt;
                }&lt;br /&gt;
--[=[&lt;br /&gt;
Support Template:Anchor   {{Anker}}&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe  = Anchors&lt;br /&gt;
local GlobalMod = Anchors&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local Config = {&lt;br /&gt;
    badPattern     = &amp;quot;[#&amp;#039;\&amp;quot;%[%]&amp;lt;&amp;gt;|]&amp;quot;,&lt;br /&gt;
    globalPage     = { &amp;quot;antispam-container&amp;quot;,&lt;br /&gt;
                       &amp;quot;bodyContent&amp;quot;,&lt;br /&gt;
                       &amp;quot;catlinks&amp;quot;,&lt;br /&gt;
                       &amp;quot;centralNotice&amp;quot;,&lt;br /&gt;
                       &amp;quot;content&amp;quot;,&lt;br /&gt;
                       &amp;quot;contentSub&amp;quot;,&lt;br /&gt;
                       &amp;quot;contentSub2&amp;quot;,&lt;br /&gt;
                       &amp;quot;editform&amp;quot;,&lt;br /&gt;
                       &amp;quot;editpage-copywarn&amp;quot;,&lt;br /&gt;
                       &amp;quot;firstHeading&amp;quot;,&lt;br /&gt;
                       &amp;quot;footer&amp;quot;,&lt;br /&gt;
                       &amp;quot;fundraising&amp;quot;,&lt;br /&gt;
                       &amp;quot;jump-to-nav&amp;quot;,&lt;br /&gt;
                       &amp;quot;language-settings-dialog&amp;quot;,&lt;br /&gt;
                       &amp;quot;languagesettings-panels&amp;quot;,&lt;br /&gt;
                       &amp;quot;page-actions&amp;quot;,&lt;br /&gt;
                       &amp;quot;siteNotice&amp;quot;,&lt;br /&gt;
                       &amp;quot;siteSub&amp;quot;,&lt;br /&gt;
                       &amp;quot;toc&amp;quot;,&lt;br /&gt;
                       &amp;quot;toctitle&amp;quot;,&lt;br /&gt;
                       &amp;quot;top&amp;quot;,&lt;br /&gt;
                       &amp;quot;wikiPreview&amp;quot; },&lt;br /&gt;
    globalPatterns = { &amp;quot;^mw%-[%l%-]+$&amp;quot;,&lt;br /&gt;
                       &amp;quot;^ca%-[%l%-]+$&amp;quot;,&lt;br /&gt;
                       &amp;quot;^n%-[%l%-]+$&amp;quot;,&lt;br /&gt;
                       &amp;quot;^p%-%a%a[%a%-]+$&amp;quot;,&lt;br /&gt;
                       &amp;quot;^pt%-[%l%-]+$&amp;quot;,&lt;br /&gt;
                       &amp;quot;^wp%u&amp;quot; },&lt;br /&gt;
    errCat         = false,&lt;br /&gt;
    errClass       = &amp;quot;error_fragment&amp;quot;,&lt;br /&gt;
    errHide        = true,&lt;br /&gt;
    errNS          = false,&lt;br /&gt;
    errInvalid     = { en = &amp;quot;Invalid:&amp;quot;,&lt;br /&gt;
                       de = &amp;quot;Ungültig:&amp;quot; },&lt;br /&gt;
    errModule      = { en = &amp;quot;Library module missing:&amp;quot;,&lt;br /&gt;
                       de = &amp;quot;Bibliotheksmodul fehlt:&amp;quot; },&lt;br /&gt;
    errNoFragments = { en = &amp;quot;No fragments given&amp;quot;,&lt;br /&gt;
                       de = &amp;quot;Keine Bezeichner angegeben&amp;quot; },&lt;br /&gt;
    errUnkown      = { en = &amp;quot;Unkown parameter:&amp;quot;,&lt;br /&gt;
                       de = &amp;quot;Parameter unbekannt:&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local foreignModule = function ( access, advanced, append, alt, alert )&lt;br /&gt;
    -- Fetch global module&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access    -- string, with name of base module&lt;br /&gt;
    --     advanced  -- true, for require(); else mw.loadData()&lt;br /&gt;
    --     append    -- string, with subpage part, if any; or false&lt;br /&gt;
    --     alt       -- number, of wikidata item of root; or false&lt;br /&gt;
    --     alert     -- true, for throwing error on data problem&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns whatever, probably table&lt;br /&gt;
    -- 2020-01-01&lt;br /&gt;
    local storage = access&lt;br /&gt;
    local finer = function ()&lt;br /&gt;
                      if append then&lt;br /&gt;
                          storage = string.format( &amp;quot;%s/%s&amp;quot;,&lt;br /&gt;
                                                   storage,&lt;br /&gt;
                                                   append )&lt;br /&gt;
                      end&lt;br /&gt;
                  end&lt;br /&gt;
    local fun, lucky, r, suited&lt;br /&gt;
    if advanced then&lt;br /&gt;
        fun = require&lt;br /&gt;
    else&lt;br /&gt;
        fun = mw.loadData&lt;br /&gt;
    end&lt;br /&gt;
    GlobalMod.globalModules = GlobalMod.globalModules or { }&lt;br /&gt;
    suited = GlobalMod.globalModules[ access ]&lt;br /&gt;
    if not suited then&lt;br /&gt;
        finer()&lt;br /&gt;
        lucky, r = pcall( fun,  &amp;quot;Module:&amp;quot; .. storage )&lt;br /&gt;
    end&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        if not suited  and&lt;br /&gt;
           type( alt ) == &amp;quot;number&amp;quot;  and&lt;br /&gt;
           alt &amp;gt; 0 then&lt;br /&gt;
            suited = string.format( &amp;quot;Q%d&amp;quot;, alt )&lt;br /&gt;
            suited = mw.wikibase.getSitelink( suited )&lt;br /&gt;
            GlobalMod.globalModules[ access ] = suited or true&lt;br /&gt;
        end&lt;br /&gt;
        if type( suited ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            storage = suited&lt;br /&gt;
            finer()&lt;br /&gt;
            lucky, r = pcall( fun, storage )&lt;br /&gt;
        end&lt;br /&gt;
        if not lucky and alert then&lt;br /&gt;
            error( &amp;quot;Missing or invalid page: &amp;quot; .. storage )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- foreignModule()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function factory( apply )&lt;br /&gt;
    -- Localization of messages&lt;br /&gt;
    --     apply  -- string, with message key&lt;br /&gt;
    -- Returns message text; at least English&lt;br /&gt;
    -- TODO: Might be extended by tabData and Multilingual&lt;br /&gt;
    local entry = Config[ apply ]&lt;br /&gt;
    local r&lt;br /&gt;
    if entry then&lt;br /&gt;
        -- TODO: page language&lt;br /&gt;
        r = entry[ mw.language.getContentLanguage():getCode() ]&lt;br /&gt;
        if not r then&lt;br /&gt;
            r = entry.en&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                        :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                        :wikitext( string.format( &amp;quot;????.%s.????&amp;quot;,&lt;br /&gt;
                                                  apply ) ) )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- factory()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function faculty( adjust )&lt;br /&gt;
    -- Test template arg for boolean&lt;br /&gt;
    --     adjust  -- string or nil&lt;br /&gt;
    -- Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    if type( adjust ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( adjust )&lt;br /&gt;
        if r ~= &amp;quot;&amp;quot;  and  r ~= &amp;quot;0&amp;quot; then&lt;br /&gt;
            r = true&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = adjust or false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- faculty()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fair( assembly )&lt;br /&gt;
    -- Create HTML code for anchors&lt;br /&gt;
    --     assembly  -- sequence table, with identifiers&lt;br /&gt;
    -- Returns HTML string&lt;br /&gt;
    local collection = mw.html.create( &amp;quot;&amp;quot; )&lt;br /&gt;
    local f = function ( a )&lt;br /&gt;
                  collection:node( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                          :attr( &amp;quot;id&amp;quot;, a ) )&lt;br /&gt;
              end&lt;br /&gt;
    local s, seen, shift&lt;br /&gt;
    table.sort( assembly )&lt;br /&gt;
    for i = 1, #assembly do&lt;br /&gt;
        s = assembly[ i ]&lt;br /&gt;
        if s ~= seen then&lt;br /&gt;
            if not s:match( &amp;quot;^[%w_]+$&amp;quot; ) then&lt;br /&gt;
                shift = mw.uri.encode( s, &amp;quot;WIKI&amp;quot; )&lt;br /&gt;
                if shift ~= s then&lt;br /&gt;
                    f( shift:gsub( &amp;quot;%%&amp;quot;, &amp;quot;.&amp;quot; ) )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            f( s )&lt;br /&gt;
            seen = s&lt;br /&gt;
        end&lt;br /&gt;
    end -- i = 1, #assembly&lt;br /&gt;
    return tostring( collection )&lt;br /&gt;
end -- fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( alert, about )&lt;br /&gt;
    -- Format message with class=&amp;quot;error&amp;quot; or similar&lt;br /&gt;
    --     alert  -- string, with message key&lt;br /&gt;
    --     about  -- string, with explanation&lt;br /&gt;
    -- Returns message with markup&lt;br /&gt;
    local scope = Config.errClass&lt;br /&gt;
    local story = factory( alert )&lt;br /&gt;
    local TemplUtl = foreignModule( &amp;quot;TemplUtl&amp;quot;,&lt;br /&gt;
                                    true,&lt;br /&gt;
                                    false,&lt;br /&gt;
                                    Anchors.globals.TemplUtl )&lt;br /&gt;
    local r, scope, style&lt;br /&gt;
    if type( TemplUtl ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( TemplUtl.TemplUtl ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
        TemplUtl = TemplUtl.TemplUtl()&lt;br /&gt;
    else&lt;br /&gt;
        TemplUtl = false&lt;br /&gt;
    end&lt;br /&gt;
    if Config.self then&lt;br /&gt;
        story = string.format( &amp;quot;%s * %s&amp;quot;, Config.self, story )&lt;br /&gt;
    end&lt;br /&gt;
    if Config.errClasses then&lt;br /&gt;
        if scope then&lt;br /&gt;
            scope = string.format( &amp;quot;%s %s&amp;quot;,&lt;br /&gt;
                                   scope, Config.errClasses )&lt;br /&gt;
        else&lt;br /&gt;
            scope = Config.errClasses&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if about then&lt;br /&gt;
        story = string.format( &amp;quot;%s %s&amp;quot;, story, about )&lt;br /&gt;
    end&lt;br /&gt;
    if TemplUtl then&lt;br /&gt;
        r = TemplUtl.failure( story,&lt;br /&gt;
                              not Config.errHide,&lt;br /&gt;
                              scope,&lt;br /&gt;
                              Config.frame )&lt;br /&gt;
    else&lt;br /&gt;
        r = tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                             :addClass( scope )&lt;br /&gt;
                             :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                             :wikitext( story ) )&lt;br /&gt;
    end&lt;br /&gt;
    if Config.errCat then&lt;br /&gt;
        if Config.errNS then&lt;br /&gt;
            local st = type( Config.errNS )&lt;br /&gt;
            if st == &amp;quot;number&amp;quot; then&lt;br /&gt;
                st = { }&lt;br /&gt;
                table.insert( st, Config.errNS )&lt;br /&gt;
                Config.errNS = st&lt;br /&gt;
            elseif st == &amp;quot;string&amp;quot; then&lt;br /&gt;
                Config.errNS = mw.text.split( Config.errNS, &amp;quot;%s+&amp;quot; )&lt;br /&gt;
                for i = 1, #Config.errNS do&lt;br /&gt;
                    Config.errNS[ i ] = tonumber( Config.errNS[ i ] )&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
            if type( Config.errNS ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local ns = mw.title.getCurrentTitle().namespace&lt;br /&gt;
                for i = 1, #Config.errNS do&lt;br /&gt;
                    if Config.errNS[ i ] == ns then&lt;br /&gt;
                        Config.errNS = false&lt;br /&gt;
                        break    -- for i&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not Config.errNS then&lt;br /&gt;
            r = string.format( &amp;quot;%s[[Category:%s]]&amp;quot;, r, Config.errCat )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function features( adapt )&lt;br /&gt;
    -- Set parameters on compliance&lt;br /&gt;
    if type( adapt ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        Config.limitMarkup = faculty( adapt.rejectMarkup )&lt;br /&gt;
        Config.limitMW     = faculty( adapt.rejectMW )&lt;br /&gt;
        Config.limitXML    = faculty( adapt.onlyXML )&lt;br /&gt;
        Config.lightXML    = faculty( adapt.softXML )&lt;br /&gt;
    end&lt;br /&gt;
end -- features()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function main( argsF, argsT )&lt;br /&gt;
    -- Invocation&lt;br /&gt;
    --     argsF  -- table, with #invoke parameters, or false&lt;br /&gt;
    --     argsT  -- table, with template parameters&lt;br /&gt;
    -- Returns appropriate string&lt;br /&gt;
    local r&lt;br /&gt;
    if type( argsF ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        Config.errCat     = argsF.errCat&lt;br /&gt;
        Config.errClasses = argsF.errClasses&lt;br /&gt;
        Config.errHide    = faculty( argsF.errHide )&lt;br /&gt;
        Config.errNS      = argsF.errNS&lt;br /&gt;
        features( argsF )&lt;br /&gt;
if mw.site.server:find( &amp;quot;de.wikipedia.&amp;quot;, 1, true ) then&lt;br /&gt;
    Config.errClasses  = &amp;quot;Linkwartung&amp;quot;&lt;br /&gt;
    Config.errHide     = true&lt;br /&gt;
    Config.errNS       = 0&lt;br /&gt;
    Config.limitMarkup = true&lt;br /&gt;
    Config.limitMW     = false&lt;br /&gt;
    Config.limitXML    = true&lt;br /&gt;
    Config.lightXML    = true&lt;br /&gt;
end&lt;br /&gt;
    end&lt;br /&gt;
    if type( argsT ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local e, got, less, s, unknown&lt;br /&gt;
        for k, v in pairs( argsT ) do&lt;br /&gt;
            if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                v = mw.text.trim( v )&lt;br /&gt;
                if v == &amp;quot;&amp;quot; then&lt;br /&gt;
                    v = false&lt;br /&gt;
                end&lt;br /&gt;
                less = ( k &amp;lt; 0 )&lt;br /&gt;
                k = false&lt;br /&gt;
            else&lt;br /&gt;
                less = k:match( &amp;quot;^[x%-][1-9]%d*&amp;quot; )&lt;br /&gt;
                if less then&lt;br /&gt;
                    k = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if k then&lt;br /&gt;
                unknown = unknown  or  { }&lt;br /&gt;
                table.insert( unknown, k )&lt;br /&gt;
            elseif v then&lt;br /&gt;
                got      = got  or  { }&lt;br /&gt;
                v        = v:gsub( &amp;quot; +&amp;quot;, &amp;quot;_&amp;quot; )&lt;br /&gt;
                            :gsub( &amp;quot;_+&amp;quot;, &amp;quot;_&amp;quot; )&lt;br /&gt;
                got[ v ] = less&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if unknown then&lt;br /&gt;
            e = mw.html.create( &amp;quot;code&amp;quot; )&lt;br /&gt;
                  :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                  :wikitext( table.concat( unknown, &amp;quot; &amp;quot; ) )&lt;br /&gt;
            s = string.format( &amp;quot; in [[%s]]&amp;quot;,&lt;br /&gt;
                               Config.frame:getTitle() )&lt;br /&gt;
            e:tag( &amp;quot;span&amp;quot; )&lt;br /&gt;
             :wikitext( s )&lt;br /&gt;
            r = fault( &amp;quot;errUnkown&amp;quot;, tostring( e ) )&lt;br /&gt;
        elseif got then&lt;br /&gt;
            local profile = { limitMarkup = false,&lt;br /&gt;
                              limitMW     = false,&lt;br /&gt;
                              limitXML    = false }&lt;br /&gt;
            local bad, checked, legal, o, s&lt;br /&gt;
            for k, v in pairs( got ) do&lt;br /&gt;
                if v then&lt;br /&gt;
                    o = profile&lt;br /&gt;
                else&lt;br /&gt;
                    o = false&lt;br /&gt;
                end&lt;br /&gt;
                s, legal = Anchors.feasible( k, o )&lt;br /&gt;
                if s then&lt;br /&gt;
                    checked = checked  or  { }&lt;br /&gt;
                    table.insert( checked, s )&lt;br /&gt;
                end&lt;br /&gt;
                if not legal then&lt;br /&gt;
                    bad = bad  or  { }&lt;br /&gt;
                    e   = mw.html.create( &amp;quot;code&amp;quot; )&lt;br /&gt;
                                 :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                                 :wikitext( mw.text.encode( k ) )&lt;br /&gt;
                    table.insert( bad, tostring( e ) )&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
            if checked then&lt;br /&gt;
                r = fair( checked )&lt;br /&gt;
            end&lt;br /&gt;
            if bad then&lt;br /&gt;
                s = string.format( &amp;quot;%s in [[%s]]&amp;quot;,&lt;br /&gt;
                                   table.concat( bad, &amp;quot;, &amp;quot; ),&lt;br /&gt;
                                   Config.frame:getParent():getTitle() )&lt;br /&gt;
                r = string.format( &amp;quot;%s%s&amp;quot;,&lt;br /&gt;
                                   r or &amp;quot;&amp;quot;,&lt;br /&gt;
                                   fault( &amp;quot;errInvalid&amp;quot;, s ) )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = fault( &amp;quot;errNoFragments&amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- main()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Anchors.feasible = function ( analyse, allow )&lt;br /&gt;
    -- Check ID for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     analyse   -- string, with presumptive anchor&lt;br /&gt;
    --     allow     -- optional table, with compliance criteria&lt;br /&gt;
    --                  -- limitMarkup&lt;br /&gt;
    --                  -- limitMW&lt;br /&gt;
    --                  -- limitXML&lt;br /&gt;
    --                  -- lightXML&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns&lt;br /&gt;
    --         1.   -- string  -- with normalised anchor&lt;br /&gt;
    --              -- false   -- if not appropriate&lt;br /&gt;
    --         2.   -- true, if fully compliant&lt;br /&gt;
    local r1 = false&lt;br /&gt;
    local r2 = false&lt;br /&gt;
    if type( analyse ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local s = mw.text.trim( analyse )&lt;br /&gt;
        if s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local deny = { limitMarkup = Config.limitMarkup,&lt;br /&gt;
                           limitMW     = Config.limitMW,&lt;br /&gt;
                           limitXML    = Config.limitXML,&lt;br /&gt;
                           lightXML    = Config.lightXML }&lt;br /&gt;
            if type( allow ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                for k, v in pairs( deny ) do&lt;br /&gt;
                    if type( allow[ k ] ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                        deny[ k ] = allow[ k ]&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for k, v&lt;br /&gt;
            end&lt;br /&gt;
            if deny.limitMW then&lt;br /&gt;
                r1 = true&lt;br /&gt;
            else&lt;br /&gt;
                s  = mw.text.unstripNoWiki( s )&lt;br /&gt;
                s  = mw.text.trim( s )&lt;br /&gt;
                r1 = ( s ~= &amp;quot;&amp;quot; )&lt;br /&gt;
            end&lt;br /&gt;
            if r1   and   deny.limitMarkup   and&lt;br /&gt;
               ( s:match( Config.badPattern )  or&lt;br /&gt;
                 s:match( &amp;quot;&amp;amp;#%w+;&amp;quot; ) ) then&lt;br /&gt;
                r1 = false&lt;br /&gt;
            end&lt;br /&gt;
            if r1 then&lt;br /&gt;
                for k = 1, #Config.globalPage do&lt;br /&gt;
                    if s == Config.globalPage[ k ] then&lt;br /&gt;
                        r1 = false&lt;br /&gt;
                        break    -- k = 1, #Config.globalPage&lt;br /&gt;
                    end&lt;br /&gt;
                end -- k = 1, #Config.globalPage&lt;br /&gt;
                if r1 then&lt;br /&gt;
                    Config.badCtrl = Config.badCtrl  or&lt;br /&gt;
                                     string.format( &amp;quot;[%c-%c]&amp;quot;, 1, 31 )&lt;br /&gt;
                    r1 = not s:find( Config.badCtrl )&lt;br /&gt;
                    if r1  and  s:match( &amp;quot;%%%x%x&amp;quot; ) then&lt;br /&gt;
                        r1 = false&lt;br /&gt;
                    end&lt;br /&gt;
                    if r1 then&lt;br /&gt;
                        for k = 1, #Config.globalPatterns do&lt;br /&gt;
                            if s:match( Config.globalPatterns[ k ] ) then&lt;br /&gt;
                                r1 = false&lt;br /&gt;
                                break    -- k = 1, #Config.globalPatterns&lt;br /&gt;
                            end&lt;br /&gt;
                        end -- k = 1, #Config.globalPatterns&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if r1 then&lt;br /&gt;
                r2 = true&lt;br /&gt;
                if deny.limitXML   and&lt;br /&gt;
                   ( s:match( &amp;quot;^%d&amp;quot; )  or&lt;br /&gt;
                     s:sub( 1, 1 ) == &amp;quot;-&amp;quot; ) then&lt;br /&gt;
                    r2 = false&lt;br /&gt;
                    if not deny.lightXML then&lt;br /&gt;
                        r1 = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if r1 then&lt;br /&gt;
                r1 = s:gsub( &amp;quot; +&amp;quot;, &amp;quot;_&amp;quot; )&lt;br /&gt;
                      :gsub( &amp;quot;_+&amp;quot;, &amp;quot;_&amp;quot; )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2&lt;br /&gt;
end -- Anchors.feasible()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Failsafe.failsafe = function ( atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     atleast  -- string, with required version or &amp;quot;wikidata&amp;quot; or &amp;quot;~&amp;quot;&lt;br /&gt;
    --                 or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2019-10-15&lt;br /&gt;
    local last  = ( atleast == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Failsafe.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 entity = mw.wikibase.getEntity( string.format( &amp;quot;Q%d&amp;quot;,&lt;br /&gt;
                                                                 item ) )&lt;br /&gt;
            if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local seek = Failsafe.serialProperty or &amp;quot;P348&amp;quot;&lt;br /&gt;
                local vsn  = entity:formatPropertyValues( seek )&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;
                    if last  and  vsn.value == Failsafe.serial then&lt;br /&gt;
                        r = false&lt;br /&gt;
                    else&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;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Failsafe.serial then&lt;br /&gt;
            r = Failsafe.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 -- Failsafe.failsafe()&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.f = function ( frame )&lt;br /&gt;
    local lucky, r&lt;br /&gt;
    Config.frame = frame&lt;br /&gt;
    lucky, r = pcall( main, frame.args, frame:getParent().args )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        r = tostring( mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                        :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                        :wikitext( string.format( &amp;quot;%s * %s&amp;quot;,&lt;br /&gt;
                                                  frame:getTitle(),&lt;br /&gt;
                                                  r ) ) )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.f()&lt;br /&gt;
&lt;br /&gt;
p.feasible = function ( frame )&lt;br /&gt;
    local r1, r2&lt;br /&gt;
    Config.frame = frame&lt;br /&gt;
    features( frame.args )&lt;br /&gt;
    r1, r2 = Anchors.feasible( frame.args[ 1 ] )&lt;br /&gt;
    return r1 or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.feasible()&lt;br /&gt;
&lt;br /&gt;
p.forbidden = function ()&lt;br /&gt;
    local r   = &amp;quot;&amp;quot;&lt;br /&gt;
    local sep = &amp;quot;&amp;quot;&lt;br /&gt;
    local e&lt;br /&gt;
    for k = 1, #Config.globalPage do&lt;br /&gt;
        e   = mw.html.create( &amp;quot;code&amp;quot; )&lt;br /&gt;
                     :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                     :wikitext( Config.globalPage[ k ] )&lt;br /&gt;
        r   = string.format( &amp;quot;%s%s%s&amp;quot;, r, sep, tostring( e ) )&lt;br /&gt;
        sep = &amp;quot;, &amp;quot;&lt;br /&gt;
    end -- k = 1, #Config.globalPage&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.forbidden()&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 Failsafe.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe()&lt;br /&gt;
&lt;br /&gt;
p.Anchors = function ()&lt;br /&gt;
    return Anchors&lt;br /&gt;
end -- p.Anchors&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>de&gt;PerfektesChaos</name></author>
	</entry>
</feed>