<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://biblex.rechtzeitig-ev.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin</id>
	<title>Rechtzeitig BibLex - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://biblex.rechtzeitig-ev.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Admin"/>
	<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php/Spezial:Beitr%C3%A4ge/Admin"/>
	<updated>2026-05-12T12:14:36Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=MediaWiki:Citoid-template-type-map.json&amp;diff=402</id>
		<title>MediaWiki:Citoid-template-type-map.json</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=MediaWiki:Citoid-template-type-map.json&amp;diff=402"/>
		<updated>2022-02-23T14:45:28Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;artwork&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;audioRecording&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;bill&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;blogPost&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;book&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;bookSection&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;case&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;computerProgram&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;conferencePaper&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;dictionaryEntry&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;document&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;encyclopediaArticle&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;film&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;forumPost&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;hearing&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;instantMessage&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;interview&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;journalArticle&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;letter&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;magazineArticle&amp;quot;: &amp;quot;Cite news&amp;quot;,&lt;br /&gt;
    &amp;quot;manuscript&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;map&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;newspaperArticle&amp;quot;: &amp;quot;Cite news&amp;quot;,&lt;br /&gt;
    &amp;quot;patent&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;podcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;presentation&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;radioBroadcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;report&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;statute&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;thesis&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;tvBroadcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;videoRecording&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;webpage&amp;quot;: &amp;quot;Cite web&amp;quot;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=MediaWiki:Citoid-template-type-map.json&amp;diff=401</id>
		<title>MediaWiki:Citoid-template-type-map.json</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=MediaWiki:Citoid-template-type-map.json&amp;diff=401"/>
		<updated>2022-02-23T14:45:01Z</updated>

		<summary type="html">&lt;p&gt;Admin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;artwork&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;audioRecording&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;bill&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;blogPost&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;book&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;bookSection&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;case&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;computerProgram&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;conferencePaper&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;dictionaryEntry&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;document&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;encyclopediaArticle&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;film&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;forumPost&amp;quot;: &amp;quot;Cite web&amp;quot;,&lt;br /&gt;
    &amp;quot;hearing&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;instantMessage&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;interview&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;journalArticle&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;letter&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;magazineArticle&amp;quot;: &amp;quot;Cite news&amp;quot;,&lt;br /&gt;
    &amp;quot;manuscript&amp;quot;: &amp;quot;Cite book&amp;quot;,&lt;br /&gt;
    &amp;quot;map&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;newspaperArticle&amp;quot;: &amp;quot;Cite news&amp;quot;,&lt;br /&gt;
    &amp;quot;patent&amp;quot;: &amp;quot;Cite patent&amp;quot;,&lt;br /&gt;
    &amp;quot;podcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;presentation&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;radioBroadcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;report&amp;quot;: &amp;quot;Cite journal&amp;quot;,&lt;br /&gt;
    &amp;quot;statute&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;thesis&amp;quot;: &amp;quot;Cite thesis&amp;quot;,&lt;br /&gt;
    &amp;quot;tvBroadcast&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;videoRecording&amp;quot;: &amp;quot;Zitat&amp;quot;,&lt;br /&gt;
    &amp;quot;webpage&amp;quot;: &amp;quot;Cite web&amp;quot;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:WLink&amp;diff=400</id>
		<title>Modul:WLink</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:WLink&amp;diff=400"/>
		<updated>2022-02-23T14:42:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local WLink = { suite   = &amp;quot;WLink&amp;quot;,&lt;br /&gt;
                serial  = &amp;quot;2020-07-01&amp;quot;,&lt;br /&gt;
                item    = 19363224,&lt;br /&gt;
                globals = { URLutil = 10859193 } };&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
ansiPercent()&lt;br /&gt;
formatURL()&lt;br /&gt;
getArticleBase()&lt;br /&gt;
getBaseTitle()&lt;br /&gt;
getEscapedTitle()&lt;br /&gt;
getExtension()&lt;br /&gt;
getFile()&lt;br /&gt;
getFragment()&lt;br /&gt;
getLanguage()&lt;br /&gt;
getLinktextProblem()&lt;br /&gt;
getNamespace()&lt;br /&gt;
getNamespaced()&lt;br /&gt;
getPlain()&lt;br /&gt;
getProject()&lt;br /&gt;
getTarget()&lt;br /&gt;
getTalkPage()&lt;br /&gt;
getTargetPage()&lt;br /&gt;
getTitle()&lt;br /&gt;
getWeblink()&lt;br /&gt;
getWikilink()&lt;br /&gt;
isBracketedLink()&lt;br /&gt;
isBracketedURL()&lt;br /&gt;
isCategorization()&lt;br /&gt;
isExternalLink()&lt;br /&gt;
isInterlanguage()&lt;br /&gt;
isInterwiki()&lt;br /&gt;
isMedia()&lt;br /&gt;
isTalkPage()&lt;br /&gt;
isTitledLink()&lt;br /&gt;
isValidLink()&lt;br /&gt;
isValidLinktext()&lt;br /&gt;
isWikilink()&lt;br /&gt;
pageLink()&lt;br /&gt;
pageTarget()&lt;br /&gt;
wikilink()&lt;br /&gt;
failsafe()&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- local globals&lt;br /&gt;
local URLutil   = false;&lt;br /&gt;
local Failsafe  = WLink;&lt;br /&gt;
local GlobalMod = WLink;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local htmlInline = { b      = true,&lt;br /&gt;
                     bdi    = true,&lt;br /&gt;
                     bdo    = true,&lt;br /&gt;
                     big    = true,&lt;br /&gt;
                     code   = true,&lt;br /&gt;
                     em     = true,&lt;br /&gt;
                     i      = true,&lt;br /&gt;
                     kbd    = true,&lt;br /&gt;
                     s      = true,&lt;br /&gt;
                     samp   = true,&lt;br /&gt;
                     small  = true,&lt;br /&gt;
                     span   = true,&lt;br /&gt;
                     strong = true,&lt;br /&gt;
                     style  = true,&lt;br /&gt;
                     sub    = true,&lt;br /&gt;
                     sup    = true,&lt;br /&gt;
                     tt     = true,&lt;br /&gt;
                     var    = true };&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 utilURL = function ()&lt;br /&gt;
    -- Attach URLutil library module&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  table, with URLutil library&lt;br /&gt;
    --     Throws error, if not available&lt;br /&gt;
    if not URLutil then&lt;br /&gt;
        local util = foreignModule( &amp;quot;URLutil&amp;quot;,&lt;br /&gt;
                                    true,&lt;br /&gt;
                                    false,&lt;br /&gt;
                                    WLink.globals.URLutil );&lt;br /&gt;
        if type( util ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            URLutil = util.URLutil();&lt;br /&gt;
        else&lt;br /&gt;
            util = &amp;quot;library URLutil invalid&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if type( URLutil ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            error( util, 0 );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return URLutil;&lt;br /&gt;
end -- utilURL()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local cleanWikilink = function ( access )&lt;br /&gt;
    -- Refine wikilink spacing and decode&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- string, with presumable link&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with pretty target&lt;br /&gt;
    local r;&lt;br /&gt;
    if not WLink.lrm then&lt;br /&gt;
        WLink.lrm = mw.ustring.char( 0x200E );&lt;br /&gt;
        WLink.rlm = mw.ustring.char( 0x200F );&lt;br /&gt;
    end&lt;br /&gt;
    r = access:gsub( &amp;quot;_&amp;quot;,        &amp;quot; &amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;,   &amp;quot; &amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;thinsp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;#160;&amp;quot;,   &amp;quot; &amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;#8239;&amp;quot;,  &amp;quot; &amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;lrm;&amp;quot;,    &amp;quot;&amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;&amp;amp;rlm;&amp;quot;,    &amp;quot;&amp;quot; )&lt;br /&gt;
              :gsub( WLink.lrm,  &amp;quot;&amp;quot; )&lt;br /&gt;
              :gsub( WLink.rlm,  &amp;quot;&amp;quot; )&lt;br /&gt;
              :gsub( &amp;quot;%s+&amp;quot;,      &amp;quot; &amp;quot; );&lt;br /&gt;
    r = mw.text.decode( r );&lt;br /&gt;
    return r;&lt;br /&gt;
end -- cleanWikilink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local contentExtlink = function ( attempt )&lt;br /&gt;
    -- Retrieve span of external link between brackets&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                         the first char is expected to be &amp;quot;[&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, number, number&lt;br /&gt;
    --                  string including whitespace&lt;br /&gt;
    --                  number with index of relevant &amp;quot;[&amp;quot;&lt;br /&gt;
    --                  number with index after relevant &amp;quot;]&amp;quot;&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1 = false;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local r3 = attempt:find( &amp;quot;]&amp;quot;, 2, true );&lt;br /&gt;
    if r3 then&lt;br /&gt;
        local s = attempt:sub( 2,  r3 - 1 );&lt;br /&gt;
        local i = s:find( &amp;quot;[&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            r1 = s:sub( i + 1 );&lt;br /&gt;
            r2 = i;&lt;br /&gt;
        else&lt;br /&gt;
            r1 = s;&lt;br /&gt;
            r2 = 1;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r3 = false;&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2, r3;&lt;br /&gt;
end -- contentExtlink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local contentWikilink = function ( attempt )&lt;br /&gt;
    -- Retrieve span of wikilink between brackets&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                        the first two chars are expected to be &amp;quot;[[&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, number, number&lt;br /&gt;
    --                  string including whitespace&lt;br /&gt;
    --                  number with index of relevant &amp;quot;[[&amp;quot;&lt;br /&gt;
    --                  number with index after relevant &amp;quot;]]&amp;quot;&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1 = false;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local r3 = attempt:find( &amp;quot;]]&amp;quot;, 3, true );&lt;br /&gt;
    if r3 then&lt;br /&gt;
        local s = attempt:sub( 3,  r3 - 1 );&lt;br /&gt;
        local i = s:find( &amp;quot;[[&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            r1 = s:sub( i + 2 );&lt;br /&gt;
            r2 = i;&lt;br /&gt;
        else&lt;br /&gt;
            r1 = s;&lt;br /&gt;
            r2 = 1;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2, r3;&lt;br /&gt;
end -- contentWikilink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local extractExtlink = function ( attempt )&lt;br /&gt;
    -- Retrieve external link&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                        the first char is expected to be &amp;quot;[&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, string&lt;br /&gt;
    --                  first with target and title&lt;br /&gt;
    --                  second result false if not titled&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1 = false;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local s = contentExtlink( attempt );&lt;br /&gt;
    if s then&lt;br /&gt;
        local i = s:find( &amp;quot;%s&amp;quot;, 1 );&lt;br /&gt;
        if i then&lt;br /&gt;
            r1 = s:sub( 1,  i - 1 );&lt;br /&gt;
            r2 = mw.text.trim( s:sub( i + 1 ) );&lt;br /&gt;
            if r2 == &amp;quot;&amp;quot; then&lt;br /&gt;
                r2 = false;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r1 = s;&lt;br /&gt;
        end&lt;br /&gt;
        if r1 then&lt;br /&gt;
            r1 = mw.text.trim( r1 );&lt;br /&gt;
            if r1 == &amp;quot;&amp;quot;  or&lt;br /&gt;
               not utilURL().isResourceURL( r1 ) then&lt;br /&gt;
                r1 = false;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r1 then&lt;br /&gt;
            r2 = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- extractExtlink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local extractWikilink = function ( attempt )&lt;br /&gt;
    -- Retrieve wikilink&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                        the first two chars are expected to be &amp;quot;[[&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, string&lt;br /&gt;
    --                  first with target&lt;br /&gt;
    --                  second result title, or false if not piped&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1 = false;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local s = contentWikilink( attempt );&lt;br /&gt;
    if s then&lt;br /&gt;
        local i = s:find( &amp;quot;|&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            r1 = s:sub( 1,  i - 1 );&lt;br /&gt;
            r2 = s:sub( i + 1 );&lt;br /&gt;
        else&lt;br /&gt;
            r1 = s;&lt;br /&gt;
        end&lt;br /&gt;
        r1 = mw.text.trim( r1 );&lt;br /&gt;
        if r1 == &amp;quot;&amp;quot; then&lt;br /&gt;
            r1 = false;&lt;br /&gt;
        else&lt;br /&gt;
            r1 = cleanWikilink( r1 );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- extractWikilink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local farming = function ( already )&lt;br /&gt;
    -- Retrieve wikifarm project information&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     already  -- table, with wikilink components&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  table, with wikilink components extended&lt;br /&gt;
    local r = already;&lt;br /&gt;
    if not r.project then&lt;br /&gt;
        local codes  = { mediawiki   = &amp;quot;mw&amp;quot;,&lt;br /&gt;
                         wikibooks   = &amp;quot;b&amp;quot;,&lt;br /&gt;
                         wikidata    = &amp;quot;d&amp;quot;,&lt;br /&gt;
                         wikinews    = &amp;quot;n&amp;quot;,&lt;br /&gt;
                         wikipedia   = &amp;quot;w&amp;quot;,&lt;br /&gt;
                         wikiquote   = &amp;quot;q&amp;quot;,&lt;br /&gt;
                         wikisource  = &amp;quot;s&amp;quot;,&lt;br /&gt;
                         wikiversity = &amp;quot;v&amp;quot;,&lt;br /&gt;
                         wikivoyage  = &amp;quot;voy&amp;quot;,&lt;br /&gt;
                         wiktionary  = &amp;quot;wikt&amp;quot; };&lt;br /&gt;
        local server = mw.site.server:gsub( &amp;quot;([/.])m%.&amp;quot;,&lt;br /&gt;
                                             &amp;quot;%1&amp;quot; )&lt;br /&gt;
                                      :gsub( &amp;quot;%.beta%.wmflabs%.org$&amp;quot;,&lt;br /&gt;
                                             &amp;quot;.org&amp;quot; );&lt;br /&gt;
        local site   = server:match( &amp;quot;[/.](%l+)%.org$&amp;quot; );&lt;br /&gt;
        r.project = codes[ site ];&lt;br /&gt;
        if r.project then&lt;br /&gt;
            if not r.lang  and&lt;br /&gt;
               r.project ~= &amp;quot;mw&amp;quot;  and  r.project ~= &amp;quot;d&amp;quot; then&lt;br /&gt;
                r.lang = server:match( &amp;quot;//(%l+)%.&amp;quot; );&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            site = server:match( &amp;quot;//(%l+)%.wikimedia%.org$&amp;quot; );&lt;br /&gt;
            if site == &amp;quot;commons&amp;quot;  or  site == &amp;quot;meta&amp;quot; then&lt;br /&gt;
                r.project = site;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if r.project  and  r.ns  and&lt;br /&gt;
       ( r.project == &amp;quot;commons&amp;quot;  or&lt;br /&gt;
         r.project == &amp;quot;d&amp;quot;        or&lt;br /&gt;
         r.project == &amp;quot;meta&amp;quot;     or&lt;br /&gt;
         r.project == &amp;quot;mw&amp;quot; ) then&lt;br /&gt;
        r.language = true;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- farming()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local prefix = function ( ask )&lt;br /&gt;
    -- Interprete prefix of language or project type&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask    -- string, with presumable prefix&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string,string or nil&lt;br /&gt;
    --                     first  string one of &amp;quot;lead&amp;quot;, &amp;quot;lang&amp;quot;, &amp;quot;project&amp;quot;&lt;br /&gt;
    --                     second string is formatted value&lt;br /&gt;
    --                       type is one of &amp;quot;lead&amp;quot;, &amp;quot;lang&amp;quot;, &amp;quot;project&amp;quot;&lt;br /&gt;
    --              nil if nothing found&lt;br /&gt;
    local r1, r2;&lt;br /&gt;
    local prefixes = { b           = true,&lt;br /&gt;
                       c           = &amp;quot;commons&amp;quot;,&lt;br /&gt;
                       d           = true,&lt;br /&gt;
                       commons     = true,&lt;br /&gt;
                       m           = &amp;quot;meta&amp;quot;,&lt;br /&gt;
                       mediawiki   = &amp;quot;mw&amp;quot;,&lt;br /&gt;
                       mw          = true,&lt;br /&gt;
                       meta        = true,&lt;br /&gt;
                       n           = true,&lt;br /&gt;
                       q           = true,&lt;br /&gt;
                       s           = true,&lt;br /&gt;
                       simple      = false,&lt;br /&gt;
                       v           = true,&lt;br /&gt;
                       voy         = true,&lt;br /&gt;
                       w           = true,&lt;br /&gt;
                       wikibooks   = &amp;quot;b&amp;quot;,&lt;br /&gt;
                       wikidata    = &amp;quot;d&amp;quot;,&lt;br /&gt;
                       wikinews    = &amp;quot;n&amp;quot;,&lt;br /&gt;
                       wikipedia   = &amp;quot;w&amp;quot;,&lt;br /&gt;
                       wikiquote   = &amp;quot;q&amp;quot;,&lt;br /&gt;
                       wikisource  = &amp;quot;s&amp;quot;,&lt;br /&gt;
                       wikiversity = &amp;quot;v&amp;quot;,&lt;br /&gt;
                       wikivoyage  = &amp;quot;voy&amp;quot;,&lt;br /&gt;
                       wikt        = true,&lt;br /&gt;
                       wiktionary  = &amp;quot;wikt&amp;quot;&lt;br /&gt;
                     };&lt;br /&gt;
    local s = mw.text.trim( ask );&lt;br /&gt;
    if s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local p;&lt;br /&gt;
        s = s:lower();&lt;br /&gt;
        p = prefixes[ s ];&lt;br /&gt;
        if p == true then&lt;br /&gt;
            r1 = &amp;quot;project&amp;quot;;&lt;br /&gt;
            r2 = s;&lt;br /&gt;
        elseif p then&lt;br /&gt;
            r1 = &amp;quot;project&amp;quot;;&lt;br /&gt;
            r2 = p;&lt;br /&gt;
        elseif p == false then&lt;br /&gt;
            r1 = &amp;quot;lang&amp;quot;;&lt;br /&gt;
            r2 = s;&lt;br /&gt;
        elseif s:match( &amp;quot;^%l%l%l?$&amp;quot; )&lt;br /&gt;
               and  mw.language.isSupportedLanguage( s ) then&lt;br /&gt;
            r1 = &amp;quot;lang&amp;quot;;&lt;br /&gt;
            r2 = s;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- prefix()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local target = function ( attempt, lonely )&lt;br /&gt;
    -- Retrieve first target (wikilink or URL), or entire string&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    --     lonely   -- remove fragment, if true&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, number&lt;br /&gt;
    --                  string, with detected link target, or entire&lt;br /&gt;
    --                  number, with number of brackets, if found, or 2&lt;br /&gt;
    local r1, r2 = WLink.getTarget( attempt );&lt;br /&gt;
    if not r1 then&lt;br /&gt;
        r1 = mw.text.trim( attempt );&lt;br /&gt;
        r2 = 2;&lt;br /&gt;
    end&lt;br /&gt;
    if lonely then&lt;br /&gt;
        local i = r1:find( &amp;quot;#&amp;quot;, 1, true );&lt;br /&gt;
        if i == 1 then&lt;br /&gt;
            r1 = &amp;quot;&amp;quot;;&lt;br /&gt;
        elseif i then&lt;br /&gt;
            r1 = r1:sub( 1, i - 1 );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- target()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.ansiPercent( attempt, alter )&lt;br /&gt;
    -- Convert string by ANSI encoding rather than UTF-8 encoding&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable ANSI characters&lt;br /&gt;
    --     alter    -- string or nil, to use for spaces instead of %20&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, encoded&lt;br /&gt;
    local k, s;&lt;br /&gt;
    local r = attempt;&lt;br /&gt;
    if alter then&lt;br /&gt;
        r = r:gsub( &amp;quot; &amp;quot;, alter );&lt;br /&gt;
    end&lt;br /&gt;
    for i = mw.ustring.len( r ), 1, -1 do&lt;br /&gt;
        k = mw.ustring.codepoint( r, i, i );&lt;br /&gt;
        if k &amp;lt;= 32  or  k &amp;gt; 126 then&lt;br /&gt;
            if k &amp;gt; 255 then&lt;br /&gt;
                s = mw.ustring.sub( r, i, i );&lt;br /&gt;
                if k &amp;gt; 2047 then&lt;br /&gt;
                    s = string.format( &amp;quot;%%%2X%%%2X%%%2X&amp;quot;,&lt;br /&gt;
                                       s:byte( 1, 1 ),&lt;br /&gt;
                                       s:byte( 2, 2 ),&lt;br /&gt;
                                       s:byte( 3, 3 ) );&lt;br /&gt;
                else&lt;br /&gt;
                    s = string.format( &amp;quot;%%%2X%%%2X&amp;quot;,&lt;br /&gt;
                                       s:byte( 1, 1 ),&lt;br /&gt;
                                       s:byte( 2, 2 ) );&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                s = string.format( &amp;quot;%%%02X&amp;quot;, k );&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                               mw.ustring.sub( r,  1,  i - 1 ),&lt;br /&gt;
                               s,&lt;br /&gt;
                               mw.ustring.sub( r,  i + 1 ) );&lt;br /&gt;
        end&lt;br /&gt;
    end -- for --i&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.ansiPercent()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.formatURL( adjust, assure )&lt;br /&gt;
    -- Create bracketed link, if not yet&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string, with URL or domain/path or bracketed link&lt;br /&gt;
    --     assure  -- boolean, true for secure HTTP&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with bracketed link&lt;br /&gt;
    --              false on invalid format&lt;br /&gt;
    local r;&lt;br /&gt;
    if type( adjust ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        if WLink.isBracketedLink( adjust ) then&lt;br /&gt;
            r = adjust;&lt;br /&gt;
        else&lt;br /&gt;
            local url = mw.text.trim( adjust );&lt;br /&gt;
            local host;&lt;br /&gt;
            utilURL();&lt;br /&gt;
            host = URLutil.getHost( adjust );&lt;br /&gt;
            if not host then&lt;br /&gt;
                url = &amp;quot;://&amp;quot; .. adjust;&lt;br /&gt;
                if assure then&lt;br /&gt;
                    url = &amp;quot;s&amp;quot; .. url;&lt;br /&gt;
                end&lt;br /&gt;
                url  = &amp;quot;http&amp;quot; .. url;&lt;br /&gt;
                host = URLutil.getHost( url );&lt;br /&gt;
            end&lt;br /&gt;
            if host then&lt;br /&gt;
                local path = URLutil.getRelativePath( url );&lt;br /&gt;
                local show;&lt;br /&gt;
                if path == &amp;quot;/&amp;quot; then&lt;br /&gt;
                    if not url:match( &amp;quot;/$&amp;quot; ) then&lt;br /&gt;
                        url = url .. &amp;quot;/&amp;quot;;&lt;br /&gt;
                    end&lt;br /&gt;
                    show = host;&lt;br /&gt;
                else&lt;br /&gt;
                    local i = path:find( &amp;quot;#&amp;quot; );&lt;br /&gt;
                    if i then&lt;br /&gt;
                        path = path:sub( 1,  i - 1 );&lt;br /&gt;
                    end&lt;br /&gt;
                    show = host .. path;&lt;br /&gt;
                end&lt;br /&gt;
                r = string.format( &amp;quot;[%s %s]&amp;quot;, url, show );&lt;br /&gt;
            else&lt;br /&gt;
                r = adjust;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.formatURL()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getArticleBase( attempt )&lt;br /&gt;
    -- Retrieve generic article title, no fragment nor brackets&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title&lt;br /&gt;
    --                         current page title, if missing&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with identified lemma, or all&lt;br /&gt;
    --              false on invalid format&lt;br /&gt;
    local r;&lt;br /&gt;
    if attempt then&lt;br /&gt;
        local m;&lt;br /&gt;
        r, m = target( attempt, true );&lt;br /&gt;
        if m ~= 2 then&lt;br /&gt;
            r = false;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = mw.title.getCurrentTitle().text;&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        local sub = r:match( &amp;quot;^(.*%S) *%(.+%)$&amp;quot; );&lt;br /&gt;
        if sub then&lt;br /&gt;
            r = sub;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getArticleBase()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getBaseTitle( attempt )&lt;br /&gt;
    -- Retrieve last segment in subpage, no fragment&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with identified segment, or all&lt;br /&gt;
    local r;&lt;br /&gt;
    local s, m = target( attempt, true );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local sub = s:match( &amp;quot;/([^/]+)$&amp;quot; );&lt;br /&gt;
        if sub then&lt;br /&gt;
            r = sub;&lt;br /&gt;
        else&lt;br /&gt;
            r = s;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getBaseTitle()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getEscapedTitle( attempt )&lt;br /&gt;
    -- Retrieve escaped link title&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with suitable link title&lt;br /&gt;
    local s = mw.text.trim( attempt );&lt;br /&gt;
    return s:gsub( &amp;quot;\n&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
            :gsub( &amp;quot;%[&amp;quot;, &amp;quot;&amp;amp;#91;&amp;quot; )&lt;br /&gt;
            :gsub( &amp;quot;%]&amp;quot;, &amp;quot;&amp;amp;#93;&amp;quot; )&lt;br /&gt;
            :gsub( &amp;quot;|&amp;quot;,  &amp;quot;&amp;amp;#124;&amp;quot; );&lt;br /&gt;
end -- WLink.getEscapedTitle()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getExtension( attempt )&lt;br /&gt;
    -- Retrieve media extension&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink (media link) or page title&lt;br /&gt;
    --                         if URL, PDF may be detected&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with detected downcased media type&lt;br /&gt;
    --              false if no extension found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = target( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        s = s:match( &amp;quot;%.(%a+)$&amp;quot; );&lt;br /&gt;
        if s then&lt;br /&gt;
            r = s:lower();&lt;br /&gt;
        end&lt;br /&gt;
    elseif s:upper():match( &amp;quot;[%./](PDF)%W?&amp;quot; ) then&lt;br /&gt;
        r = &amp;quot;pdf&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getExtension()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getFile( attempt )&lt;br /&gt;
    -- Retrieve media page identifier&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink (media link) or page title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with detected file title&lt;br /&gt;
    --                      no namespace nor project&lt;br /&gt;
    --              false if no file found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = target( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local slow    = &amp;quot;:&amp;quot; .. s:lower();&lt;br /&gt;
        local find = function ( a )&lt;br /&gt;
                         local seek = string.format( &amp;quot;:%s:().+%%.%%a+$&amp;quot;,&lt;br /&gt;
                                                     a:lower() );&lt;br /&gt;
                         local join = slow:find( seek );&lt;br /&gt;
                         local ret;&lt;br /&gt;
                         if join then&lt;br /&gt;
                             ret = s:sub( join + #a + 1 );&lt;br /&gt;
                         end&lt;br /&gt;
                         return ret;&lt;br /&gt;
                     end;&lt;br /&gt;
        r = find( &amp;quot;file&amp;quot; );&lt;br /&gt;
        if not r then&lt;br /&gt;
            local trsl = mw.site.namespaces[ 6 ];&lt;br /&gt;
            r = find( trsl.name );&lt;br /&gt;
            if not r then&lt;br /&gt;
                trsl = trsl.aliases;&lt;br /&gt;
                for k, v in pairs( trsl ) do&lt;br /&gt;
                    r = find( v );&lt;br /&gt;
                    if r then&lt;br /&gt;
                        break; -- for k, v&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for k, v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getFile()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getFragment( attempt )&lt;br /&gt;
    -- Retrieve fragment&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable fragment&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with detected fragment&lt;br /&gt;
    --              false if no address found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = target( attempt );&lt;br /&gt;
    if s then&lt;br /&gt;
        local i = s:find( &amp;quot;#&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            if i &amp;gt; 1 then&lt;br /&gt;
                s = s:sub( i - 1 );&lt;br /&gt;
                i = 2;&lt;br /&gt;
            end&lt;br /&gt;
            if s:find( &amp;quot;&amp;amp;#&amp;quot;, 1, true ) then&lt;br /&gt;
                s = mw.text.decode( s );&lt;br /&gt;
                i = s:find( &amp;quot;#&amp;quot;, 1, true );&lt;br /&gt;
                if not i then&lt;br /&gt;
                   s = &amp;quot;&amp;quot;;&lt;br /&gt;
                   i = 0;&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            s = s:sub( i + 1 );&lt;br /&gt;
            r = mw.text.trim( s );&lt;br /&gt;
            if r == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false;&lt;br /&gt;
            elseif m == 2 then&lt;br /&gt;
                r = r:gsub( &amp;quot;%.(%x%x)&amp;quot;, &amp;quot;%%%1&amp;quot; )&lt;br /&gt;
                     :gsub( &amp;quot;_&amp;quot;, &amp;quot; &amp;quot; );&lt;br /&gt;
                r = mw.uri.decode( r, &amp;quot;PATH&amp;quot; );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getFragment()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getLanguage( attempt )&lt;br /&gt;
    -- Retrieve language project identifier&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with detected downcased language identifier&lt;br /&gt;
    --              false if no project language found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  w.lang then&lt;br /&gt;
            r = w.lang;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getLanguage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getLinktextProblem( attempt )&lt;br /&gt;
    -- Which problem has this presumable link text?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable linktext&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with error message, or false&lt;br /&gt;
    local r;&lt;br /&gt;
    if attempt:find( &amp;quot;]&amp;quot;, 1, true ) then&lt;br /&gt;
        r = &amp;quot;&amp;amp;#93;&amp;quot;;&lt;br /&gt;
    elseif mw.text.unstripNoWiki( attempt ) ~= attempt then&lt;br /&gt;
        r = &amp;quot;&amp;amp;lt;nowiki&amp;amp;gt;&amp;quot;;&lt;br /&gt;
    elseif attempt:find( &amp;quot;\n&amp;quot;, 1, true ) then&lt;br /&gt;
        r = &amp;quot;&amp;amp;#92;n&amp;quot;;&lt;br /&gt;
    elseif mw.text.unstrip( attempt ) ~= attempt then&lt;br /&gt;
        if not WLink.stripREF then&lt;br /&gt;
            WLink.stripREF = string.format( &amp;quot;%c%c%c%c%s%c%c%c%c&amp;quot;,&lt;br /&gt;
                                            127, 39, 34, 96,&lt;br /&gt;
                                            &amp;quot;UNIQ%-+ref%-%x+%-QINU&amp;quot;,&lt;br /&gt;
                                            96, 34, 39, 127 );&lt;br /&gt;
        end&lt;br /&gt;
        if mw.ustring.find( attempt, WLink.stripREF ) then&lt;br /&gt;
            r = &amp;quot;&amp;amp;lt;ref&amp;amp;gt;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        local i = attempt:find( &amp;quot;&amp;lt;&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            local s = mw.ustring.lower( attempt:sub( i ) );&lt;br /&gt;
            local sign = true;&lt;br /&gt;
            local skip;&lt;br /&gt;
            while sign  and  not r do&lt;br /&gt;
                skip, sign = s:match( &amp;quot;^([^&amp;lt;]*&amp;lt; *)(%l[%l%d]*)[ /]*.*&amp;gt;&amp;quot; );&lt;br /&gt;
                if sign then&lt;br /&gt;
                    if htmlInline[ sign ] then&lt;br /&gt;
                        i = skip:len() + sign:len() + 1;&lt;br /&gt;
                        s = s:sub( i );&lt;br /&gt;
                    else&lt;br /&gt;
                        r = string.format( &amp;quot;&amp;amp;lt;%s&amp;amp;gt;&amp;quot;, sign );&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end    -- while sign and not r&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            local s = attempt .. &amp;quot; &amp;quot;;&lt;br /&gt;
            if s:find( &amp;quot;ISBN &amp;quot;, 1, true ) then&lt;br /&gt;
                r = s:match( &amp;quot;(ISBN %d[%-%d]+[%dxX])%W&amp;quot; );&lt;br /&gt;
            end&lt;br /&gt;
            if not r then&lt;br /&gt;
                if s:find( &amp;quot;PMID &amp;quot;, 1, true ) then&lt;br /&gt;
                    r = s:match( &amp;quot;(PMID [1-9]%d*)%W&amp;quot; );&lt;br /&gt;
                end&lt;br /&gt;
                if not r then&lt;br /&gt;
                    if s:find( &amp;quot;RFC &amp;quot;, 1, true ) then&lt;br /&gt;
                        r = s:match( &amp;quot;(RFC [1-9]%d?%d?%d?)%W&amp;quot; );&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or false;&lt;br /&gt;
end -- WLink.getLinktextProblem()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getNamespace( attempt )&lt;br /&gt;
    -- Retrieve namespace number&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  number, of detected namespace&lt;br /&gt;
    --              false if no namespace found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  not w.lang  and  not w.project  and  w.ns then&lt;br /&gt;
            r = w.ns;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getNamespace()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getNamespaced( area, attempt )&lt;br /&gt;
    -- Retrieve page in namespace&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area     -- string or number, with some namespace spec&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title or page name&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  page prefixed by namespace,&lt;br /&gt;
    --              false if invalid&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s = type( area );&lt;br /&gt;
    local room;&lt;br /&gt;
    if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        room = mw.site.namespaces[ tonumber( area )  or  area ];&lt;br /&gt;
    elseif s == &amp;quot;number&amp;quot; then&lt;br /&gt;
        room = mw.site.namespaces[ area ];&lt;br /&gt;
    end&lt;br /&gt;
    if room then&lt;br /&gt;
        local m;&lt;br /&gt;
        s, m = WLink.getTarget( attempt );&lt;br /&gt;
        if not s then&lt;br /&gt;
            s = attempt;&lt;br /&gt;
        elseif m ~= 2 then&lt;br /&gt;
            s = false;&lt;br /&gt;
        end&lt;br /&gt;
        if s then&lt;br /&gt;
            local w = WLink.wikilink( s );&lt;br /&gt;
            if w  and  not w.lang  and  not w.project  and&lt;br /&gt;
               ( not w.ns  or  w.ns == room.id ) then&lt;br /&gt;
                r = string.format( &amp;quot;%s:%s&amp;quot;,&lt;br /&gt;
                                   room.name, w.title );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getNamespaced()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getPlain( attempt )&lt;br /&gt;
    -- Retrieve text with all links replaced by link titles&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikitext&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with modified wikitext without links&lt;br /&gt;
    local r = attempt;&lt;br /&gt;
    local i = 1;&lt;br /&gt;
    local j, k, n, lean, s, shift, span, space, suffix;&lt;br /&gt;
    while ( true ) do&lt;br /&gt;
        j = r:find( &amp;quot;[&amp;quot;, i, true );&lt;br /&gt;
        if j then&lt;br /&gt;
            suffix = r:sub( j );&lt;br /&gt;
            i      = j + 1;&lt;br /&gt;
            lean   = ( r:byte( i, i ) == 91 );&lt;br /&gt;
            if lean then&lt;br /&gt;
                s, k, n = contentWikilink( suffix );&lt;br /&gt;
            else&lt;br /&gt;
                s, k, n = contentExtlink( suffix );&lt;br /&gt;
            end&lt;br /&gt;
            if s then&lt;br /&gt;
                if k &amp;gt; 1 then&lt;br /&gt;
                    n      = n - k;&lt;br /&gt;
                    i      = j + k + 1;&lt;br /&gt;
                    j      = i - 1;&lt;br /&gt;
                    suffix = r:sub( j );&lt;br /&gt;
                end&lt;br /&gt;
                if lean then&lt;br /&gt;
                    s, shift = extractWikilink( suffix );&lt;br /&gt;
                    if s then&lt;br /&gt;
                        space = s:match( &amp;quot;^([^:]+):&amp;quot; );&lt;br /&gt;
                        if space then&lt;br /&gt;
                            space = mw.site.namespaces[ space ];&lt;br /&gt;
                            if space then&lt;br /&gt;
                                space = space.id;&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        if space == 6  or  space == 14 then&lt;br /&gt;
                            shift = &amp;quot;&amp;quot;;&lt;br /&gt;
                        elseif not shift then&lt;br /&gt;
                            shift = s;&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        s     = &amp;quot;&amp;quot;;&lt;br /&gt;
                        shift = &amp;quot;&amp;quot;;&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    span, shift = extractExtlink( suffix );&lt;br /&gt;
                    if span then&lt;br /&gt;
                        if not shift then&lt;br /&gt;
                            shift = &amp;quot;&amp;quot;;&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        shift = string.format( &amp;quot;[%s]&amp;quot;, s );&lt;br /&gt;
                    end&lt;br /&gt;
                    i = i - 1;&lt;br /&gt;
                end&lt;br /&gt;
                if j &amp;gt; 1 then&lt;br /&gt;
                    s = r:sub( 1, j - 1 );&lt;br /&gt;
                else&lt;br /&gt;
                    s = &amp;quot;&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
                r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                                   s,  shift,  r:sub( n + i ) );&lt;br /&gt;
                i = i + #shift;&lt;br /&gt;
            else&lt;br /&gt;
                break; -- while true&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            break; -- while true&lt;br /&gt;
        end&lt;br /&gt;
    end    -- while true&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getPlain()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getProject( attempt )&lt;br /&gt;
    -- Retrieve wikifarm project identifier&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with wikilink or page title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with detected downcased project identifier&lt;br /&gt;
    --              false if no project identifier found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  w.project then&lt;br /&gt;
            r = w.project;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getProject()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getTalkPage( attempt )&lt;br /&gt;
    -- Retrieve talk page name for attempt, or that page name itself&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  or  false&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m ~= 2  and  attempt then&lt;br /&gt;
        s = mw.text.trim( attempt );&lt;br /&gt;
    end&lt;br /&gt;
    if s  and  s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local w = mw.title.new( s );&lt;br /&gt;
        if w then&lt;br /&gt;
            w = w.talkPageTitle;&lt;br /&gt;
            if w then&lt;br /&gt;
                r = w.prefixedText;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getTalkPage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getTarget( attempt )&lt;br /&gt;
    -- Retrieve first target (wikilink or URL)&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, number&lt;br /&gt;
    --                  string, with first detected link target&lt;br /&gt;
    --                  number, with number of brackets, if found&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1 = false;&lt;br /&gt;
    local r2 = false;&lt;br /&gt;
    local i  = attempt:find( &amp;quot;[&amp;quot;, 1, true );&lt;br /&gt;
    if i then&lt;br /&gt;
        local m;&lt;br /&gt;
        r1 = attempt:sub( i );&lt;br /&gt;
        if r1:byte( 2, 2 ) == 91 then&lt;br /&gt;
            m  = 2;&lt;br /&gt;
            r1 = extractWikilink( r1 );&lt;br /&gt;
        else&lt;br /&gt;
            m  = 1;&lt;br /&gt;
            r1 = extractExtlink( r1 );&lt;br /&gt;
        end&lt;br /&gt;
        if r1 then&lt;br /&gt;
            r2 = m;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r1 = attempt:match( &amp;quot;%A?([hf]t?tps?://%S+)%s?&amp;quot; );&lt;br /&gt;
        if r1 then&lt;br /&gt;
            if utilURL().isResourceURL( r1 ) then&lt;br /&gt;
                r2 = 0;&lt;br /&gt;
            else&lt;br /&gt;
                r1 = false;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r1 = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- WLink.getTarget()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getTargetPage( attempt )&lt;br /&gt;
    -- Retrieve first target page (page name or URL of page)&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with first detected linked page&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r1, r2 = WLink.getTarget( attempt );&lt;br /&gt;
    if r1 then&lt;br /&gt;
        local i = r1:find( &amp;quot;#&amp;quot;, 1, true );&lt;br /&gt;
        if i then&lt;br /&gt;
            if i == 1 then&lt;br /&gt;
                r1 = false;&lt;br /&gt;
            else&lt;br /&gt;
                r1 = mw.text.trim( r1:sub( 1,  i - 1 ) );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2;&lt;br /&gt;
end -- WLink.getTargetPage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getTitle( attempt )&lt;br /&gt;
    -- Retrieve first link title (wikilink or URL), or wikilink target&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with first detected link target&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local i = attempt:find( &amp;quot;[&amp;quot;, 1, true );&lt;br /&gt;
    if i then&lt;br /&gt;
        local s1, s2;&lt;br /&gt;
        r = attempt:sub( i );&lt;br /&gt;
        if r:byte( 2, 2 ) == 91 then&lt;br /&gt;
            s1, s2 = extractWikilink( r );&lt;br /&gt;
            if s2 then&lt;br /&gt;
                r = s2;&lt;br /&gt;
            else&lt;br /&gt;
                r = s1;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            s1, r = extractExtlink( r );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getTitle()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getWeblink( attempt, anURLutil )&lt;br /&gt;
    -- Retrieve bracketed link from resource URL&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt    -- string, with URL, or something different&lt;br /&gt;
    --     anURLutil  -- library module object, or nil&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with first detected link target&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local second = &amp;quot;.ac.co.go.gv.or.&amp;quot;;&lt;br /&gt;
    local r;&lt;br /&gt;
    if type( anURLutil ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        URLutil = anURLutil;&lt;br /&gt;
    else&lt;br /&gt;
        utilURL();&lt;br /&gt;
    end&lt;br /&gt;
    if URLutil.isResourceURL( attempt ) then&lt;br /&gt;
        local site    = URLutil.getAuthority( attempt );&lt;br /&gt;
        local service = attempt;&lt;br /&gt;
        local show;&lt;br /&gt;
        if #attempt == #site then&lt;br /&gt;
           site = site .. &amp;quot;/&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        show = URLutil.getTop3domain( &amp;quot;//&amp;quot; .. site );&lt;br /&gt;
        if show then&lt;br /&gt;
            local scan   = &amp;quot;[%./](%a[%a%%%-]*%a)(%.%l%l%.)(%a+)$&amp;quot;;&lt;br /&gt;
            local search = &amp;quot;.&amp;quot; .. show;&lt;br /&gt;
            local s1, s2, s3 = search:match( scan );&lt;br /&gt;
            if s2 then&lt;br /&gt;
                if not second:find( s2, 1, true ) then&lt;br /&gt;
                    show = string.format( &amp;quot;%s%s&amp;quot;,  s2:sub( 2 ),  s3 );&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                show = false;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not show then&lt;br /&gt;
            show = URLutil.getTop2domain( &amp;quot;//&amp;quot; .. site );&lt;br /&gt;
            if not show then&lt;br /&gt;
                show = URLutil.getHost( &amp;quot;//&amp;quot; .. site );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not service:match( &amp;quot;^[a-z:]*//.+/&amp;quot; ) then&lt;br /&gt;
            service = service .. &amp;quot;/&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        r = string.format( &amp;quot;[%s %s]&amp;quot;, service, show );&lt;br /&gt;
    else&lt;br /&gt;
        r = attempt;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getWeblink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.getWikilink( attempt, appear )&lt;br /&gt;
    -- Retrieve bracketed link from text&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with current target, or plain&lt;br /&gt;
    --     appear   -- string, with link title, or nil&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string, with first detected link target&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local r = WLink.pageTarget( attempt );&lt;br /&gt;
    if r then&lt;br /&gt;
        if appear then&lt;br /&gt;
            local show = WLink.getEscapedTitle( appear );&lt;br /&gt;
            if show ~= r  and  show ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                r = string.format( &amp;quot;%s|%s&amp;quot;, r, show );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        r = string.format( &amp;quot;[[%s]]&amp;quot;, r );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.getWikilink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isBracketedLink( attempt )&lt;br /&gt;
    -- Does attempt match a bracketed link?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local i = attempt:find( &amp;quot;[&amp;quot;, 1, true );&lt;br /&gt;
    if i then&lt;br /&gt;
        local s = attempt:sub( i );&lt;br /&gt;
        if s:byte( 2, 2 ) == 91 then&lt;br /&gt;
            s = extractWikilink( s );&lt;br /&gt;
        else&lt;br /&gt;
            s = extractExtlink( s );&lt;br /&gt;
        end&lt;br /&gt;
        if s then&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isBracketedLink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isBracketedURL( attempt )&lt;br /&gt;
    -- Does attempt match a bracketed URL?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local s, r = WLink.getTarget( attempt );&lt;br /&gt;
    return ( r == 1 );&lt;br /&gt;
end -- WLink.isBracketedURL()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isCategorization( attempt )&lt;br /&gt;
    -- Does attempt match a categorization?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  w.ns == 14&lt;br /&gt;
              and  not ( w.lead or w.lang or w.project )&lt;br /&gt;
              and  w.title ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isCategorization()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isExternalLink( attempt )&lt;br /&gt;
    -- Does attempt match an external link?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local s, r = WLink.getTarget( attempt );&lt;br /&gt;
    if r then&lt;br /&gt;
        r = ( r &amp;lt; 2 );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isExternalLink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isInterlanguage( attempt )&lt;br /&gt;
    -- Does attempt match an interlanguage link?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w and w.lang and not w.project and not w.lead&lt;br /&gt;
             and  w.title ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isInterlanguage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isInterwiki( attempt )&lt;br /&gt;
    -- Does attempt match an interwiki link within wikifarm?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  ( w.lang or w.project )  and  w.title ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isInterwiki()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isMedia( attempt )&lt;br /&gt;
    -- Does attempt match a media translusion?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m == 2 then&lt;br /&gt;
        local w = WLink.wikilink( s );&lt;br /&gt;
        if w  and  w.ns == 6&lt;br /&gt;
           and  not ( w.lead or w.lang or w.project )&lt;br /&gt;
           and  w.title ~= &amp;quot;&amp;quot;&lt;br /&gt;
           and  WLink.getExtension( w.title ) then&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isMedia()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isTalkPage( attempt )&lt;br /&gt;
    -- Does attempt describe a talk page?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    if m ~= 2  and  attempt then&lt;br /&gt;
        s = mw.text.trim( attempt );&lt;br /&gt;
    end&lt;br /&gt;
    if s  and  s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local w = mw.title.new( s );&lt;br /&gt;
        if w then&lt;br /&gt;
            r = w.isTalkPage;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isTalkPage()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isTitledLink( attempt )&lt;br /&gt;
    -- Does attempt match a titled link?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local i = attempt:find( &amp;quot;[&amp;quot;, 1, true );&lt;br /&gt;
    if i then&lt;br /&gt;
        local c, n;&lt;br /&gt;
        local s = attempt:sub( i );&lt;br /&gt;
        if s:byte( 2, 2 ) == 91 then&lt;br /&gt;
            n = s:find( &amp;quot;%]%]&amp;quot;, 5 );&lt;br /&gt;
            c = &amp;quot;|&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            n = s:find( &amp;quot;%]&amp;quot;, 8 );&lt;br /&gt;
            c = &amp;quot;%s%S&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if n then&lt;br /&gt;
            local m = s:find( c, 2 );&lt;br /&gt;
            if m  and  m + 1 &amp;lt; n  and  WLink.getTarget( attempt ) then&lt;br /&gt;
                r = true;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isTitledLink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isValidLink( attempt )&lt;br /&gt;
    -- Does attempt match a link?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local u, r = WLink.getTarget( attempt );&lt;br /&gt;
    if r then&lt;br /&gt;
        if r &amp;lt; 2 then&lt;br /&gt;
            if u:find( &amp;quot;''&amp;quot;, 1, true ) then&lt;br /&gt;
                r = false;&lt;br /&gt;
            else&lt;br /&gt;
                r = true;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = true;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.isValidLink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isValidLinktext( attempt, allow )&lt;br /&gt;
    -- Is attempt a plain inline text?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable linktext&lt;br /&gt;
    --     allow    -- boolean or nil, if multiline permitted&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local s;&lt;br /&gt;
    if allow  and  s:find( &amp;quot;\n&amp;quot;, 1, true ) then&lt;br /&gt;
        s = attempt:gsub( &amp;quot;\n&amp;quot;, &amp;quot; &amp;quot; );&lt;br /&gt;
    else&lt;br /&gt;
        s = attempt;&lt;br /&gt;
    end&lt;br /&gt;
    return  not WLink.getLinktextProblem( s );&lt;br /&gt;
end -- WLink.isValidLinktext()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.isWikilink( attempt )&lt;br /&gt;
    -- Does attempt match a wikilink?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link somewhere&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  boolean&lt;br /&gt;
    local s, m = WLink.getTarget( attempt );&lt;br /&gt;
    return ( m == 2 );&lt;br /&gt;
end -- WLink.isWikilink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.pageLink( attempt, appear, assure )&lt;br /&gt;
    -- Create safely standardized wikilink target of a page&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --     appear   -- string or true or nil, with link title&lt;br /&gt;
    --     assure   -- string or nil, shield against wiki template syntax&lt;br /&gt;
    --                 &amp;quot;URL&amp;quot; or &amp;quot;WIKI&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string with link target&lt;br /&gt;
    local r = WLink.pageTarget( attempt, assure );&lt;br /&gt;
    if appear then&lt;br /&gt;
        local show;&lt;br /&gt;
        if type( appear ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            show = appear;&lt;br /&gt;
        else&lt;br /&gt;
            show = attempt;&lt;br /&gt;
        end&lt;br /&gt;
        r = string.format( &amp;quot;%s|%s&amp;quot;, r, show );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.pageLink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.pageTarget( attempt, assure )&lt;br /&gt;
    -- Create standardized wikilink target of a page&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                         expected to be enclosed in &amp;quot;[[&amp;quot; &amp;quot;]]&amp;quot;&lt;br /&gt;
    --                         else wikilink&lt;br /&gt;
    --                 table, of assignments with { type, value }&lt;br /&gt;
    --                        type is one of &amp;quot;lead&amp;quot;,&lt;br /&gt;
    --                             &amp;quot;project&amp;quot;, &amp;quot;lang&amp;quot;,&lt;br /&gt;
    --                             &amp;quot;ns&amp;quot;, &amp;quot;space&amp;quot;, &amp;quot;title&amp;quot;&lt;br /&gt;
    --     assure   -- string or nil, shield against wiki template syntax&lt;br /&gt;
    --                 &amp;quot;URL&amp;quot; or &amp;quot;WIKI&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string with link target&lt;br /&gt;
    local p = type( attempt );&lt;br /&gt;
    local s = assure;&lt;br /&gt;
    local r;&lt;br /&gt;
    if p == &amp;quot;string&amp;quot; then&lt;br /&gt;
        p = WLink.wikilink( attempt );&lt;br /&gt;
    elseif p == &amp;quot;table&amp;quot; then&lt;br /&gt;
        p = attempt;&lt;br /&gt;
    else&lt;br /&gt;
        p = false;&lt;br /&gt;
    end&lt;br /&gt;
    if p then&lt;br /&gt;
        local site  = p.project;&lt;br /&gt;
        local slang = p.lang;&lt;br /&gt;
        local lead;&lt;br /&gt;
        if p.title:sub( 1, 1 ) == &amp;quot;#&amp;quot; then&lt;br /&gt;
            p.title = mw.title.getCurrentTitle().text + p.title;&lt;br /&gt;
        end&lt;br /&gt;
        if p.ns then&lt;br /&gt;
            if not slang then&lt;br /&gt;
                p = farming( p );&lt;br /&gt;
            end&lt;br /&gt;
            if p.lang  and&lt;br /&gt;
               p.lang ~= mw.language.getContentLanguage():getCode() then&lt;br /&gt;
                p.language = true;&lt;br /&gt;
            end&lt;br /&gt;
            if p.language then&lt;br /&gt;
                p.space = mw.site.namespaces[ p.ns ].canonicalName;&lt;br /&gt;
            end&lt;br /&gt;
            lead = ( p.ns == 6  or  p.ns == 14 );&lt;br /&gt;
        end&lt;br /&gt;
        if slang then&lt;br /&gt;
            lead = true;&lt;br /&gt;
        end&lt;br /&gt;
        if s == &amp;quot;WIKI&amp;quot; then&lt;br /&gt;
            if not site   and&lt;br /&gt;
               ( lead  or&lt;br /&gt;
                 ( not p.space  and&lt;br /&gt;
                   p.title and p.title:match( &amp;quot;^[*;]&amp;quot; ) ) ) then&lt;br /&gt;
                p     = farming( p );&lt;br /&gt;
                site  = p.project;&lt;br /&gt;
                slang = p.lang;&lt;br /&gt;
            end&lt;br /&gt;
            s = false;&lt;br /&gt;
        end&lt;br /&gt;
        if site then&lt;br /&gt;
            r = site .. &amp;quot;:&amp;quot;;&lt;br /&gt;
        elseif lead then&lt;br /&gt;
            r = &amp;quot;:&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;&amp;quot;;&lt;br /&gt;
        end&lt;br /&gt;
        if slang then&lt;br /&gt;
            r = string.format( &amp;quot;%s%s:&amp;quot;, r, slang );&lt;br /&gt;
        end&lt;br /&gt;
        if p.space then&lt;br /&gt;
            r = string.format( &amp;quot;%s%s:&amp;quot;, r, p.space );&lt;br /&gt;
        end&lt;br /&gt;
        if p.title then&lt;br /&gt;
            r = r .. p.title;&lt;br /&gt;
        end&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        p = { lang = mw.language.getContentLanguage():getCode() };&lt;br /&gt;
        if s == &amp;quot;WIKI&amp;quot; then&lt;br /&gt;
            r = WLink.pageTarget( p, s );&lt;br /&gt;
            s = false;&lt;br /&gt;
        else&lt;br /&gt;
            r = string.format( &amp;quot;:%s:&amp;quot;, p.lang );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if s == &amp;quot;URL&amp;quot;  and  r:match( &amp;quot;^[*#;:]&amp;quot; ) then&lt;br /&gt;
        r = mw.uri.encode( r:sub( 1, 1 ) )  ..  r:sub( 2 );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.pageTarget()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function WLink.wikilink( attempt )&lt;br /&gt;
    -- Retrieve wikilink components&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable link&lt;br /&gt;
    --                         expected to be enclosed in &amp;quot;[[&amp;quot; &amp;quot;]]&amp;quot;&lt;br /&gt;
    --                         else wikilink&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  table or false&lt;br /&gt;
    --              table of assignments with { type, value }&lt;br /&gt;
    --                       type is one of &amp;quot;lead&amp;quot;,&lt;br /&gt;
    --                          &amp;quot;project&amp;quot;, &amp;quot;lang&amp;quot;,&lt;br /&gt;
    --                          &amp;quot;ns&amp;quot;, &amp;quot;space&amp;quot;, &amp;quot;title&amp;quot;&lt;br /&gt;
    --              false if nothing found&lt;br /&gt;
    local s = contentWikilink( attempt or &amp;quot;&amp;quot; );&lt;br /&gt;
    local got, i, n, r;&lt;br /&gt;
    if not s then&lt;br /&gt;
        s = attempt;&lt;br /&gt;
    end&lt;br /&gt;
    if s:find( &amp;quot;%&amp;quot;, 1, true ) then&lt;br /&gt;
        s = mw.uri.decode( s, &amp;quot;PATH&amp;quot; );&lt;br /&gt;
    end&lt;br /&gt;
    i = s:find( &amp;quot;|&amp;quot;, 1, true );&lt;br /&gt;
    if i then&lt;br /&gt;
        s = s:sub( 1, i - 1 );&lt;br /&gt;
    end&lt;br /&gt;
    got = mw.text.split( s, &amp;quot;:&amp;quot; );&lt;br /&gt;
    n   = table.maxn( got );&lt;br /&gt;
    if n == 1 then&lt;br /&gt;
        r = { title = mw.text.trim( s ) };&lt;br /&gt;
    else&lt;br /&gt;
        local j, k, o, v;&lt;br /&gt;
        r = { title = &amp;quot;&amp;quot; };&lt;br /&gt;
        while ( got[ 1 ] == &amp;quot;&amp;quot; ) do&lt;br /&gt;
            r.lead = true;&lt;br /&gt;
            table.remove( got, 1 );&lt;br /&gt;
            n = n - 1;&lt;br /&gt;
        end    -- while  got[ 1 ] == &amp;quot;&amp;quot;&lt;br /&gt;
        if n &amp;gt; 4 then&lt;br /&gt;
            k = 4;&lt;br /&gt;
        elseif n &amp;gt; 1 then&lt;br /&gt;
            k = n - 1;&lt;br /&gt;
        else&lt;br /&gt;
            k = 1;&lt;br /&gt;
        end&lt;br /&gt;
        j = k;&lt;br /&gt;
        for i = 1, j do&lt;br /&gt;
            s = mw.text.trim( got[ i ] );&lt;br /&gt;
            if s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                o = mw.site.namespaces[ s ];&lt;br /&gt;
                if o then&lt;br /&gt;
                    r.ns    = o.id;&lt;br /&gt;
                    r.space = o.name;&lt;br /&gt;
                    k = i + 1;&lt;br /&gt;
                    j = i - 1;&lt;br /&gt;
                    break; -- for i&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        for i = 1, j do&lt;br /&gt;
            o, v = prefix( got[ i ] );&lt;br /&gt;
            if o then&lt;br /&gt;
                if r[ o ] then&lt;br /&gt;
                    k = i;&lt;br /&gt;
                    break; -- for i&lt;br /&gt;
                else&lt;br /&gt;
                    if i &amp;gt;= k then&lt;br /&gt;
                        k = i + 1;&lt;br /&gt;
                    end&lt;br /&gt;
                    r[ o ] = v;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                if i == 1  and  r.ns then&lt;br /&gt;
                    r.ns    = false;&lt;br /&gt;
                    r.space = false;&lt;br /&gt;
                end&lt;br /&gt;
                k = i;&lt;br /&gt;
                break; -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        if k &amp;gt; 0 then&lt;br /&gt;
            for i = k, n do&lt;br /&gt;
                r.title = r.title .. got[ i ];&lt;br /&gt;
                if i &amp;lt; n then&lt;br /&gt;
                    r.title = r.title .. &amp;quot;:&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    r.title = cleanWikilink( r.title );&lt;br /&gt;
    if r.lead and&lt;br /&gt;
       ( r.project  or&lt;br /&gt;
         ( not r.lang  and  r.ns ~= 6  and  r.ns ~= 14 ) ) then&lt;br /&gt;
        r.lead = false;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- WLink.wikilink()&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;
    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 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;
                    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;
local function Template( frame, action, leave, lone )&lt;br /&gt;
    -- Run actual code from template transclusion&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    --     action  -- string, with function name&lt;br /&gt;
    --     leave   -- true: keep whitespace around&lt;br /&gt;
    --     lone    -- true: permit call without parameters&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Return string; might be error message&lt;br /&gt;
    local lucky = true;&lt;br /&gt;
    local s = false;&lt;br /&gt;
    local r = false;&lt;br /&gt;
    local safe, space;&lt;br /&gt;
    for k, v in pairs( frame.args ) do&lt;br /&gt;
        if k == 1 then&lt;br /&gt;
            if leave then&lt;br /&gt;
                s = v;&lt;br /&gt;
            else&lt;br /&gt;
                s = mw.text.trim( v );&lt;br /&gt;
            end&lt;br /&gt;
        elseif ( k == 2   and&lt;br /&gt;
                 ( action == &amp;quot;getNamespaced&amp;quot;  or&lt;br /&gt;
                   action == &amp;quot;getWikilink&amp;quot;  or&lt;br /&gt;
                   action == &amp;quot;pageLink&amp;quot; ) )    or&lt;br /&gt;
               ( k == &amp;quot;space&amp;quot;  and  action == &amp;quot;ansiPercent&amp;quot; ) then&lt;br /&gt;
            v = mw.text.trim( v );&lt;br /&gt;
            if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                space = v;&lt;br /&gt;
            end&lt;br /&gt;
        elseif k == &amp;quot;safe&amp;quot;  and  action == &amp;quot;pageLink&amp;quot; then&lt;br /&gt;
            v = mw.text.trim( v );&lt;br /&gt;
            if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                safe = v;&lt;br /&gt;
            end&lt;br /&gt;
        elseif k == &amp;quot;lines&amp;quot;  and  action == &amp;quot;isValidLinktext&amp;quot; then&lt;br /&gt;
            space = ( k == &amp;quot;1&amp;quot; );&lt;br /&gt;
        elseif k ~= &amp;quot;template&amp;quot; then&lt;br /&gt;
            lucky = false;&lt;br /&gt;
            if r then&lt;br /&gt;
                r = r .. &amp;quot;|&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;Unknown parameter: &amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;%s%s=&amp;quot;, r, k );&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if lucky then&lt;br /&gt;
        if s or lone then&lt;br /&gt;
            lucky, r = pcall( WLink[ action ],  s,  space,  safe );&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;Parameter missing&amp;quot;;&lt;br /&gt;
            lucky = false;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if lucky then&lt;br /&gt;
        if type( r ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
            if r then&lt;br /&gt;
                r = &amp;quot;1&amp;quot;;&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;&amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; );&lt;br /&gt;
        r = tostring( e:addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                       :wikitext( r ) );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- Template()&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.ansiPercent = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;ansiPercent&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.formatURL = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;formatURL&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getArticleBase = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getArticleBase&amp;quot;, false, true );&lt;br /&gt;
end&lt;br /&gt;
p.getBaseTitle = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getBaseTitle&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getEscapedTitle = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getEscapedTitle&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getExtension = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getExtension&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getFile = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getFile&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getFragment = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getFragment&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getInterwiki = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getInterwiki&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getLanguage = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getLanguage&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getLinktextProblem = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getLinktextProblem&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getNamespace = function ( frame )&lt;br /&gt;
    return tostring( Template( frame, &amp;quot;getNamespace&amp;quot; ) );&lt;br /&gt;
end&lt;br /&gt;
p.getNamespaced = function ( frame )&lt;br /&gt;
    return tostring( Template( frame, &amp;quot;getNamespaced&amp;quot; ) );&lt;br /&gt;
end&lt;br /&gt;
p.getPlain = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getPlain&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getProject = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getProject&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getTalkPage = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getTalkPage&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getTarget = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getTarget&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getTargetPage = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getTargetPage&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getTitle = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getTitle&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getWeblink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getWeblink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.getWikilink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;getWikilink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isBracketedLink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isBracketedLink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isBracketedURL = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isBracketedURL&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isCategorization = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isCategorization&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isExternalLink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isExternalLink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isInterlanguage = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isInterlanguage&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isInterwiki = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isInterwiki&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isMedia = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isMedia&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isTalkPage = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isTalkPage&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isTitledLink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isTitledLink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isValidLink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isValidLink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isValidLinktext = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isValidLinktext&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isWeblink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isWeblink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.isWikilink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;isWikilink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.pageLink = function ( frame )&lt;br /&gt;
    return Template( frame, &amp;quot;pageLink&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
p.failsafe = function ( frame )&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;
p.WLink = function ()&lt;br /&gt;
    return WLink;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Vorlage:lang&amp;diff=398</id>
		<title>Modul:Vorlage:lang</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Vorlage:lang&amp;diff=398"/>
		<updated>2022-02-23T14:42:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Export = { serial = &amp;quot;2019-10-19&amp;quot;,&lt;br /&gt;
                 suite  = &amp;quot;lang&amp;quot;,&lt;br /&gt;
                 item   = 26826825 }&lt;br /&gt;
--[=[&lt;br /&gt;
Vorlage:lang und Sprachnamenvorlagen usw. unterstützen&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe  = Export&lt;br /&gt;
local GlobalMod = Export&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local Config = {&lt;br /&gt;
   errCat        = false,&lt;br /&gt;
   errClass      = &amp;quot;error_lang&amp;quot;,&lt;br /&gt;
   errClasses    = false,&lt;br /&gt;
   errHide       = true,&lt;br /&gt;
   errNS         = false,&lt;br /&gt;
   errDoubled    = { en = &amp;quot;Doubled:&amp;quot;,&lt;br /&gt;
                     de = &amp;quot;Doppelangabe:&amp;quot; },&lt;br /&gt;
   errEmpty      = { en = &amp;quot;Empty parameter value&amp;quot;,&lt;br /&gt;
                     de = &amp;quot;Parameterwert fehlt&amp;quot; },&lt;br /&gt;
   errInvalid    = { en = &amp;quot;Invalid:&amp;quot;,&lt;br /&gt;
                     de = &amp;quot;Ungültig:&amp;quot; },&lt;br /&gt;
   errMissing    = { en = &amp;quot;Missing parameter&amp;quot;,&lt;br /&gt;
                     de = &amp;quot;Parameter fehlt&amp;quot; },&lt;br /&gt;
   errSuggest    = { en = &amp;quot;'%s' * probably '%s' intended&amp;quot;,&lt;br /&gt;
                     de = &amp;quot;'%s' * vermutlich ist '%s' gemeint&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;
   ipa           = &amp;quot;IPA&amp;quot;,&lt;br /&gt;
   keyBase       = 100,&lt;br /&gt;
   keyProject    = 200,&lt;br /&gt;
   keyAncient    = 300,&lt;br /&gt;
   keyTranslate  = 400,&lt;br /&gt;
   params        = { &amp;quot;Text1&amp;quot;,&lt;br /&gt;
                     &amp;quot;Audio&amp;quot;,&lt;br /&gt;
                     &amp;quot;IPA&amp;quot;,&lt;br /&gt;
                     &amp;quot;class&amp;quot;,&lt;br /&gt;
                     &amp;quot;lenient&amp;quot;,&lt;br /&gt;
                     &amp;quot;script&amp;quot;,&lt;br /&gt;
                     &amp;quot;style&amp;quot;,&lt;br /&gt;
                     &amp;quot;nachgestellt&amp;quot;,&lt;br /&gt;
                     &amp;quot;demo&amp;quot;,&lt;br /&gt;
                     &amp;quot;demo2&amp;quot;,&lt;br /&gt;
                     &amp;quot;demo3&amp;quot;,&lt;br /&gt;
                     &amp;quot;demo4&amp;quot;,&lt;br /&gt;
                     &amp;quot;NoCat&amp;quot; },&lt;br /&gt;
   percents      = false,&lt;br /&gt;
   orderOther    = { grc = 1,&lt;br /&gt;
                     hbo = 2,&lt;br /&gt;
                     la  = 3,&lt;br /&gt;
                     en  = 9 },&lt;br /&gt;
   owns          = { de = &amp;quot;&amp;amp;#8218;%s&amp;amp;#8216;&amp;quot; },&lt;br /&gt;
   sepComma      = &amp;quot;Latn Armn Cyrl Grek Thai&amp;quot;,&lt;br /&gt;
   site          = &amp;quot;Latn&amp;quot;,&lt;br /&gt;
   tmplAudio     = false,    -- template for media player link&lt;br /&gt;
   tmplLang      = false,    -- template for language name link&lt;br /&gt;
   tmplStyles    = false,&lt;br /&gt;
   wikidata      = { Multilingual       = 47541920,&lt;br /&gt;
                     ISO15924           = 71584769,&lt;br /&gt;
                     [&amp;quot;ISO15924/codes&amp;quot;] = 71840276,&lt;br /&gt;
                     TemplUtl           = 52364930 }&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;
    -- 2019-10-29&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, 0 )&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 Fetch( ask )&lt;br /&gt;
    -- Fetch module (require)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     ask  -- string, with name&lt;br /&gt;
    --                     &amp;quot;ISO15924&amp;quot;&lt;br /&gt;
    --                     &amp;quot;Multilingual&amp;quot;&lt;br /&gt;
    --                     &amp;quot;TemplUtl&amp;quot;&lt;br /&gt;
    -- Returns string, with error message, if not available&lt;br /&gt;
    local ext = Config[ ask ]&lt;br /&gt;
    local r&lt;br /&gt;
    if not ext  and  ext ~= false then&lt;br /&gt;
        ext = foreignModule( ask,&lt;br /&gt;
                             true,&lt;br /&gt;
                             false,&lt;br /&gt;
                             Config.wikidata[ ask ] )&lt;br /&gt;
        if type( ext ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            Config[ ask ] = ext&lt;br /&gt;
            if type( ext[ ask ] ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                Config[ ask ] = ext[ ask ]()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( Config[ ask ] ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            Config[ ask ] = false&lt;br /&gt;
            if not ext then&lt;br /&gt;
                ext = &amp;quot;Invalid library *** Module:&amp;quot; .. ask&lt;br /&gt;
            end&lt;br /&gt;
            ext = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                         :attr( &amp;quot;class&amp;quot;, &amp;quot;error&amp;quot; )&lt;br /&gt;
                         :wikitext( ext )&lt;br /&gt;
            r = tostring( ext )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function Frame()&lt;br /&gt;
    -- Fetch current frame&lt;br /&gt;
    -- Returns frame&lt;br /&gt;
    if not Config.frame then&lt;br /&gt;
        Config.frame = mw.getCurrentFrame()&lt;br /&gt;
    end&lt;br /&gt;
    return Config.frame&lt;br /&gt;
end -- Frame()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function Friend()&lt;br /&gt;
    -- Fetch Module:ISO15924/codes&lt;br /&gt;
    if not Config.codesISO15924 then&lt;br /&gt;
        Config.codesISO15924 = foreignModule( &amp;quot;ISO15924&amp;quot;,&lt;br /&gt;
                                              false,&lt;br /&gt;
                                              &amp;quot;codes&amp;quot;,&lt;br /&gt;
                                              Config.wikidata.ISO15924 )&lt;br /&gt;
        if type( Config.codesISO15924 ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            Config.codesISO15924 = { }&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Config.codesISO15924&lt;br /&gt;
end -- Friend()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function Fulfil( access, args )&lt;br /&gt;
    -- Expand template&lt;br /&gt;
    --     apply  -- string, with template name&lt;br /&gt;
    --     args   -- table, with parameters&lt;br /&gt;
    -- Returns string&lt;br /&gt;
    -- Throws error, if template not existing&lt;br /&gt;
    return Frame():expandTemplate{ title = access,&lt;br /&gt;
                                   args  = args }&lt;br /&gt;
end -- Fulfil()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function facet( assign )&lt;br /&gt;
    -- Format language name&lt;br /&gt;
    --     apply  -- string, with language name, might be linked&lt;br /&gt;
    -- Returns string&lt;br /&gt;
    local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                     :css( { [&amp;quot;font-style&amp;quot;]  = &amp;quot;normal&amp;quot;,&lt;br /&gt;
                             [&amp;quot;font-weight&amp;quot;] = &amp;quot;normal&amp;quot; } )&lt;br /&gt;
                     :wikitext( assign )&lt;br /&gt;
    return tostring( e )&lt;br /&gt;
end -- facet()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function facility()&lt;br /&gt;
    -- Fetch current site language&lt;br /&gt;
    -- Returns language code&lt;br /&gt;
    if not Config.standard then&lt;br /&gt;
        Config.standard = mw.language.getContentLanguage():getCode()&lt;br /&gt;
    end&lt;br /&gt;
    return Config.standard&lt;br /&gt;
end -- facility()&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;
    local entry = Config[ apply ]&lt;br /&gt;
    local r&lt;br /&gt;
    if entry then&lt;br /&gt;
        r = entry[ facility() ]&lt;br /&gt;
        if not r then&lt;br /&gt;
            r = entry.en&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                         :attr( &amp;quot;class&amp;quot;, &amp;quot;error&amp;quot; )&lt;br /&gt;
                         :wikitext( string.format( &amp;quot;????.%s.????&amp;quot;,&lt;br /&gt;
                                                   apply ) )&lt;br /&gt;
        r = tostring( e )&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 s = type( adjust )&lt;br /&gt;
    local r&lt;br /&gt;
    if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( adjust )&lt;br /&gt;
        r = ( r ~= &amp;quot;&amp;quot;  and  r ~= &amp;quot;0&amp;quot;  and  r ~= &amp;quot;-&amp;quot; )&lt;br /&gt;
    elseif s == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
        r = adjust&lt;br /&gt;
    else&lt;br /&gt;
        r = 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 familiar( ask, assign )&lt;br /&gt;
    -- Check whether valid transcription for context&lt;br /&gt;
    --     ask     -- string, with transcription code&lt;br /&gt;
    --     assign  -- string or nil, with language or scripting key&lt;br /&gt;
    -- Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    Fetch( &amp;quot;ISO15924&amp;quot; )&lt;br /&gt;
    if Config.ISO15924 then&lt;br /&gt;
        r = Config.ISO15924.isTrans( ask, assign, Config.site )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- familiar()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function family()&lt;br /&gt;
    -- attempt to load local config&lt;br /&gt;
    if not Config.data then&lt;br /&gt;
        local sub = string.format( &amp;quot;%s/config&amp;quot;, Frame():getTitle() )&lt;br /&gt;
        local lucky&lt;br /&gt;
        lucky, Config.data = pcall( mw.loadData, sub )&lt;br /&gt;
        if type( Config.data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            for k, v in pairs( Config.data ) do&lt;br /&gt;
                Config[ k ] = v&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
        else&lt;br /&gt;
            Config.data = sub .. &amp;quot; not found&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end -- family()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( alert, about, assign )&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;
    --     assign  -- true, when standard category to be fired&lt;br /&gt;
    -- Returns message with markup&lt;br /&gt;
    local story = factory( alert )&lt;br /&gt;
    local env   = Frame():getParent()&lt;br /&gt;
    local err   = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    err:addClass( Config.errClass )&lt;br /&gt;
       :css( { [&amp;quot;margin-left&amp;quot;]  = &amp;quot;1em&amp;quot;,&lt;br /&gt;
               [&amp;quot;margin-right&amp;quot;] = &amp;quot;1em&amp;quot; } )&lt;br /&gt;
    family()&lt;br /&gt;
    if env then&lt;br /&gt;
        story = string.format( &amp;quot;[[%s]] &amp;amp;#8211; %s&amp;quot;,&lt;br /&gt;
                               env:getTitle(), story )&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 Config.errClasses then&lt;br /&gt;
        err:addClass( Config.errClasses )&lt;br /&gt;
    end&lt;br /&gt;
    err:wikitext( story )&lt;br /&gt;
    r = Fetch( &amp;quot;TemplUtl&amp;quot; )&lt;br /&gt;
    if Config.TemplUtl then&lt;br /&gt;
        r = Config.TemplUtl.failure( tostring( err ),&lt;br /&gt;
                                     not Config.errHide,&lt;br /&gt;
                                     false,&lt;br /&gt;
                                     Frame() )&lt;br /&gt;
    end&lt;br /&gt;
    if assign  and  type( Config.errCat ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        if Config.errNS then&lt;br /&gt;
            local ns = mw.title.getCurrentTitle().namespace&lt;br /&gt;
            local st = type( Config.errNS )&lt;br /&gt;
            if st == &amp;quot;string&amp;quot; then&lt;br /&gt;
                local space  = string.format( &amp;quot;.*%%s%d%%s.*&amp;quot;, ns )&lt;br /&gt;
                local spaces = string.format( &amp;quot; %s &amp;quot;, Config.errNS )&lt;br /&gt;
                if spaces:match( space ) then&lt;br /&gt;
                    Config.errNS = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif st == &amp;quot;table&amp;quot; then&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( apply, assign )&lt;br /&gt;
    -- Equip element with script attributes&lt;br /&gt;
    --     apply   -- mw.html element&lt;br /&gt;
    --     assign  -- string, with script code&lt;br /&gt;
    if type( Config.percents ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local more = Config.percents[ assign ]&lt;br /&gt;
        if more then&lt;br /&gt;
            apply:css( &amp;quot;font-size&amp;quot;,  string.format( &amp;quot;%d%%&amp;quot;, more ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end -- features()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fill( apply )&lt;br /&gt;
    -- Expand language name template&lt;br /&gt;
    --     apply   -- string, with code&lt;br /&gt;
    -- Returns string, identical apply in case of error&lt;br /&gt;
    local r = apply&lt;br /&gt;
    local template&lt;br /&gt;
    family()&lt;br /&gt;
    template = Config.tmplLang&lt;br /&gt;
    if type( template ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local source = template.title&lt;br /&gt;
        if type( source ) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
            if type( template.namePat ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
               template.namePat:find( &amp;quot;%s&amp;quot;, 1, true ) then&lt;br /&gt;
                source = string.format( template.namePat, apply )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( source ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            local lucky, s = pcall( Fulfil, source )&lt;br /&gt;
            if lucky then&lt;br /&gt;
                r = s&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fill()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function first( assign, apply )&lt;br /&gt;
    -- Equip element with TemplateStyles&lt;br /&gt;
    --     assign  -- string, with script code&lt;br /&gt;
    --     apply   -- mw.html element, or false&lt;br /&gt;
    -- Returns string, perhaps with tag&lt;br /&gt;
    local r&lt;br /&gt;
    if type( Config.tmplStyles ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local source = Config.tmplStyles[ assign ]&lt;br /&gt;
        if source then&lt;br /&gt;
            r = Frame():extensionTag( &amp;quot;templatestyles&amp;quot;,&lt;br /&gt;
                                      nil,&lt;br /&gt;
                                      { src = source } )&lt;br /&gt;
            if apply then&lt;br /&gt;
                apply:wikitext( r )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- first()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fit( acquire )&lt;br /&gt;
    -- Retrieve script code for language&lt;br /&gt;
    --     acquire  -- string, with language code&lt;br /&gt;
    -- Returns string or false&lt;br /&gt;
    local r&lt;br /&gt;
    local iso639script = Friend().iso639script&lt;br /&gt;
    if type( iso639script ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = iso639script[ acquire ]&lt;br /&gt;
        if type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            r = r[ 1 ]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fit()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flag( already, apply )&lt;br /&gt;
    -- Check whether space separated classes contain&lt;br /&gt;
    --     already  -- string or false, with classes&lt;br /&gt;
    --     apply    -- string or false, with single class&lt;br /&gt;
    -- Returns true, if apply is in already&lt;br /&gt;
    local r&lt;br /&gt;
    if already then&lt;br /&gt;
        if apply then&lt;br /&gt;
            local classes = mw.text.split( already, &amp;quot;%s+&amp;quot; )&lt;br /&gt;
            local plus    = mw.text.split( apply, &amp;quot;%s+&amp;quot; )&lt;br /&gt;
            local single&lt;br /&gt;
            for i = 1, #plus do&lt;br /&gt;
                single = plus[ i ]&lt;br /&gt;
                for k = 1, #classes do&lt;br /&gt;
                    if classes[ k ] == single then&lt;br /&gt;
                        single = false&lt;br /&gt;
                        break -- for k&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for k&lt;br /&gt;
                if single then&lt;br /&gt;
                    table.insert( classes, single )&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
            r = table.concat( classes, &amp;quot; &amp;quot; )&lt;br /&gt;
        else&lt;br /&gt;
            r = already&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = apply&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- flag()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function flatten( apply )&lt;br /&gt;
    -- Trim any whitespace, even HTML encoded&lt;br /&gt;
    --     apply   -- string&lt;br /&gt;
    -- Returns string, or false if empty&lt;br /&gt;
    local r = apply&lt;br /&gt;
    if r:find( &amp;quot;&amp;amp;&amp;quot; ) then&lt;br /&gt;
        r = r:gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;,    &amp;quot;&amp;amp;#160;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;thinsp;&amp;quot;, &amp;quot;&amp;amp;#8201;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;zwnj;&amp;quot;,   &amp;quot;&amp;amp;#8204;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;zwj;&amp;quot;,    &amp;quot;&amp;amp;#8205;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;lrm;&amp;quot;,    &amp;quot;&amp;amp;#8206;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;rlm;&amp;quot;,    &amp;quot;&amp;amp;#8207;&amp;quot; )&lt;br /&gt;
        if r:find( &amp;quot;&amp;amp;#&amp;quot; ) then&lt;br /&gt;
            local f = function ( ax, an )&lt;br /&gt;
                          local k&lt;br /&gt;
                          if ax == &amp;quot;x&amp;quot; then&lt;br /&gt;
                              k = 16&lt;br /&gt;
                          else&lt;br /&gt;
                              k = 10&lt;br /&gt;
                          end&lt;br /&gt;
                          return mw.ustring.char( tonumber( an, k ) )&lt;br /&gt;
                      end&lt;br /&gt;
            r = r:gsub( &amp;quot;&amp;amp;#(x?)(%x+);&amp;quot;,  f )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not Config.patternWS then&lt;br /&gt;
        Config.patternWS = mw.ustring.char(   91,&lt;br /&gt;
                                               1, 45, 32,&lt;br /&gt;
                                             160,&lt;br /&gt;
                                            8194, 45, 8207,&lt;br /&gt;
                                            8239,&lt;br /&gt;
                                              93,&lt;br /&gt;
                                              43 )&lt;br /&gt;
    end&lt;br /&gt;
    r = mw.ustring.gsub( r,  &amp;quot;^&amp;quot; .. Config.patternWS,  &amp;quot;&amp;quot; )&lt;br /&gt;
    r = mw.ustring.gsub( r,  Config.patternWS .. &amp;quot;$&amp;quot;,  &amp;quot;&amp;quot; )&lt;br /&gt;
    if r == &amp;quot;&amp;quot; then&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- flatten()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function follow( affine )&lt;br /&gt;
    -- Retrieve appropriate separator&lt;br /&gt;
    --     affine    -- string or nil, with code of script&lt;br /&gt;
    -- Returns string, with separator (comma) or not&lt;br /&gt;
    local r&lt;br /&gt;
    if affine then&lt;br /&gt;
        if Config.sepComma:find( affine, 1, true ) then&lt;br /&gt;
            r = &amp;quot;,&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;,&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- follow()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function foreign( apply, acquire, advanced, affine )&lt;br /&gt;
    -- Format text in some language&lt;br /&gt;
    --     apply     -- string, with text&lt;br /&gt;
    --     acquire   -- string, with basic code of language&lt;br /&gt;
    --     advanced  -- string, with full code of language&lt;br /&gt;
    --     affine    -- string or nil, with code of script&lt;br /&gt;
    -- Returns string&lt;br /&gt;
    local story  = apply&lt;br /&gt;
    local script = affine&lt;br /&gt;
    local p = { [&amp;quot;font-weight&amp;quot;] = &amp;quot;normal&amp;quot; }&lt;br /&gt;
    local ltr, r&lt;br /&gt;
    if advanced == acquire then&lt;br /&gt;
        ltr = not mw.language.new( acquire ):isRTL()&lt;br /&gt;
    elseif not script  and  advanced:find( &amp;quot;-&amp;quot;, 3, true ) then&lt;br /&gt;
        local parts = mw.text.split( advanced, &amp;quot;-&amp;quot;, true )&lt;br /&gt;
        if #parts &amp;gt; 1  and  parts[ 2 ]:match( &amp;quot;^%u%l%l%l$&amp;quot; ) then&lt;br /&gt;
            script = parts[ 2 ]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if script then&lt;br /&gt;
        local rtl = Friend().rtl&lt;br /&gt;
        if type( rtl ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            ltr = not rtl[ script ]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if ltr then&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                         :attr( &amp;quot;lang&amp;quot;, advanced )&lt;br /&gt;
        local s = &amp;quot;normal&amp;quot;&lt;br /&gt;
        if acquire == facility()&lt;br /&gt;
           and Config.owns[ acquire ]  then&lt;br /&gt;
            story = string.format( Config.owns[ acquire ], apply )&lt;br /&gt;
        elseif advanced == acquire  and  Config.site == &amp;quot;Latn&amp;quot;   or&lt;br /&gt;
               advanced == acquire .. &amp;quot;-Latn&amp;quot; then&lt;br /&gt;
            s = &amp;quot;italic&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        p[&amp;quot;font-style&amp;quot;] = s&lt;br /&gt;
        e:css( p )&lt;br /&gt;
         :wikitext( story )&lt;br /&gt;
        r = tostring( e )&lt;br /&gt;
    else&lt;br /&gt;
        p[&amp;quot;font-style&amp;quot;] = &amp;quot;normal&amp;quot;&lt;br /&gt;
        r = Export.fold( { css       = p,&lt;br /&gt;
                           SCRIPTING = script },&lt;br /&gt;
                         { [ 1 ] = acquire,&lt;br /&gt;
                           [ 2 ] = apply,&lt;br /&gt;
                           lang  = advanced } )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- foreign()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function foreigns( ahead, aliens, alone )&lt;br /&gt;
    -- Create list of translations&lt;br /&gt;
    --     ahead   -- string, with leading separator&lt;br /&gt;
    --     aliens  -- sequence table, with assignment tables&lt;br /&gt;
    --     alone   -- boolean, no other elements in collection yet&lt;br /&gt;
    -- Returns string, starting with separator (comma)&lt;br /&gt;
    local pars = { }&lt;br /&gt;
    local sep  = ahead&lt;br /&gt;
    local lone = alone&lt;br /&gt;
    local r    = &amp;quot;&amp;quot;&lt;br /&gt;
    local k, lucky, s, t&lt;br /&gt;
    family()&lt;br /&gt;
    facility()&lt;br /&gt;
    Fetch( &amp;quot;Multilingual&amp;quot; )&lt;br /&gt;
    for i = 1, #aliens do&lt;br /&gt;
        t = aliens[ i ]&lt;br /&gt;
        if t.short == Config.standard then&lt;br /&gt;
            t.m = Config.keyProject&lt;br /&gt;
            t.n = 0&lt;br /&gt;
        else&lt;br /&gt;
            k = Config.orderOther[ t.short ]&lt;br /&gt;
            if k then&lt;br /&gt;
                t.n = k&lt;br /&gt;
                t.m = Config.keyAncient&lt;br /&gt;
            end&lt;br /&gt;
            lone = false&lt;br /&gt;
        end&lt;br /&gt;
        t.n = t.m + t.n&lt;br /&gt;
    end -- for i&lt;br /&gt;
    table.sort( aliens,&lt;br /&gt;
                function ( a1, a2 )&lt;br /&gt;
                    return ( a1.n &amp;lt; a2.n )&lt;br /&gt;
                end )&lt;br /&gt;
    for i = 1, #aliens do&lt;br /&gt;
        t = aliens[ i ]&lt;br /&gt;
        if lone then&lt;br /&gt;
            s   = &amp;quot;&amp;quot;&lt;br /&gt;
            sep = &amp;quot;&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            s = false&lt;br /&gt;
            if t.short == Config.slang  and&lt;br /&gt;
               t.script  and&lt;br /&gt;
               t.n &amp;gt; 0 then&lt;br /&gt;
                Fetch( &amp;quot;ISO15924&amp;quot; )&lt;br /&gt;
                if Config.ISO15924 then&lt;br /&gt;
                    s = Config.ISO15924.scriptName( t.script )&lt;br /&gt;
                    if s == t.script then&lt;br /&gt;
                        s = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not s  and  t.n &amp;gt; Config.keyProject then&lt;br /&gt;
                s = fill( t.short )&lt;br /&gt;
            end&lt;br /&gt;
            if not s then&lt;br /&gt;
                Fetch( &amp;quot;Multilingual&amp;quot; )&lt;br /&gt;
                s = mw.language.fetchLanguageName( t.short,&lt;br /&gt;
                                                   Config.standard )&lt;br /&gt;
                if Config.Multilingual  and&lt;br /&gt;
                   Config.Multilingual.isMinusculable( s ) then&lt;br /&gt;
                    s = mw.ustring.lower( mw.ustring.sub( s, 1, 1 ) )&lt;br /&gt;
                        .. mw.ustring.sub( s, 2 )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        r   = string.format( &amp;quot;%s%s %s %s&amp;quot;,&lt;br /&gt;
                             r,&lt;br /&gt;
                             sep,&lt;br /&gt;
                             s,&lt;br /&gt;
                             foreign( t.story,&lt;br /&gt;
                                      t.short,&lt;br /&gt;
                                      t.slang,&lt;br /&gt;
                                      t.script ) )&lt;br /&gt;
        sep = follow( t.script )&lt;br /&gt;
    end -- for i&lt;br /&gt;
    return r&lt;br /&gt;
end -- foreigns()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function friend( assigned, apply )&lt;br /&gt;
    -- Transcription unit&lt;br /&gt;
    --     assigned  -- string, transcription ID&lt;br /&gt;
    --     apply     -- string, transcription text&lt;br /&gt;
    -- Returns string&lt;br /&gt;
    local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                     :addClass( Config.site )&lt;br /&gt;
                     :attr( &amp;quot;lang&amp;quot;,&lt;br /&gt;
                            string.format( &amp;quot;%s-%s&amp;quot;,&lt;br /&gt;
                                           Config.slang,&lt;br /&gt;
                                           Config.site ) )&lt;br /&gt;
                     :css( { [&amp;quot;font-weight&amp;quot;] = &amp;quot;normal&amp;quot; } )&lt;br /&gt;
                     :wikitext( apply )&lt;br /&gt;
    local r, s&lt;br /&gt;
    if Config.site == &amp;quot;Latn&amp;quot; then&lt;br /&gt;
        s = &amp;quot;italic&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        s = &amp;quot;normal&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    e:css( { [&amp;quot;font-style&amp;quot;] = s } )&lt;br /&gt;
    if type( Config.transys ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       type( Config.transys[ assigned ] ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local transys = Config.transys[ assigned ]&lt;br /&gt;
        if transys.class then&lt;br /&gt;
            e:addClass( transys.class )&lt;br /&gt;
        end&lt;br /&gt;
        if transys.show then&lt;br /&gt;
            s = transys.show&lt;br /&gt;
        else&lt;br /&gt;
            s = assigned&lt;br /&gt;
        end&lt;br /&gt;
        if transys.support then&lt;br /&gt;
            if s == transys.support then&lt;br /&gt;
                s = string.format( &amp;quot;[[%s]]&amp;quot;, s )&lt;br /&gt;
            else&lt;br /&gt;
                s = string.format( &amp;quot;[[%s|%s]]&amp;quot;, transys.support, s )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        s = assigned&lt;br /&gt;
    end&lt;br /&gt;
    r = string.format( &amp;quot;%s %s%s&amp;quot;,&lt;br /&gt;
                       s,  first( Config.site ),  tostring( e ) )&lt;br /&gt;
    return r&lt;br /&gt;
end -- friend()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function frontend( action, argsF, argsT, about )&lt;br /&gt;
    -- Template service&lt;br /&gt;
    --     action  -- string, &amp;quot;flat&amp;quot; or &amp;quot;full&amp;quot; etc.&lt;br /&gt;
    --     argsF   -- table, with #invoke parameters, or false&lt;br /&gt;
    --     argsT   -- table, with template parameters&lt;br /&gt;
    --     about   -- string or nil, invocation name&lt;br /&gt;
    -- Returns frame&lt;br /&gt;
    local lucky, r&lt;br /&gt;
    lucky, r = pcall( Export[ action ], argsF, argsT )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                         :attr( &amp;quot;class&amp;quot;, &amp;quot;error&amp;quot; )&lt;br /&gt;
        if about then&lt;br /&gt;
            r = string.format( &amp;quot;&amp;amp;#123;{%s}&amp;amp;#125; %s&amp;quot;,  about,  r )&lt;br /&gt;
        end&lt;br /&gt;
        e:wikitext( r )&lt;br /&gt;
        r = tostring( e )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- frontend()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function frontier( frame, action )&lt;br /&gt;
    -- Template transclusion&lt;br /&gt;
    --     frame   -- object&lt;br /&gt;
    --     action  -- string, &amp;quot;flat&amp;quot; or &amp;quot;full&amp;quot; etc.&lt;br /&gt;
    -- Returns appropriate string&lt;br /&gt;
    Config.frame = frame&lt;br /&gt;
    return frontend( action,&lt;br /&gt;
                     frame.args,&lt;br /&gt;
                     frame:getParent().args,&lt;br /&gt;
                     frame:getTitle() )&lt;br /&gt;
end -- frontier()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function full( arglist )&lt;br /&gt;
    -- Finalize invocation of template&lt;br /&gt;
    --     arglist  -- table, with parameters&lt;br /&gt;
    -- Returns appropriate string&lt;br /&gt;
    local r&lt;br /&gt;
    if arglist.Text1 then&lt;br /&gt;
        local slang = Config.slang&lt;br /&gt;
        local lone  = true&lt;br /&gt;
        local s, sep&lt;br /&gt;
        if not Config.scripting then&lt;br /&gt;
            Config.scripting = fit( Config.slang )&lt;br /&gt;
        end&lt;br /&gt;
        sep = follow( Config.scripting )&lt;br /&gt;
        if Config.scripting == Config.site then&lt;br /&gt;
            if slang == facility() then&lt;br /&gt;
                arglist.style = false&lt;br /&gt;
            elseif not arglist.style then&lt;br /&gt;
                arglist.style = &amp;quot;font-style:italic&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            sep = follow( Config.site )&lt;br /&gt;
            if arglist.Text2 then&lt;br /&gt;
                arglist.Text2 = fault( &amp;quot;errInvalid&amp;quot;,&lt;br /&gt;
                                       Config.site .. &amp;quot;+2=&amp;quot;,&lt;br /&gt;
                                       true )&lt;br /&gt;
            end&lt;br /&gt;
        elseif not Config.low  and  not arglist.style then&lt;br /&gt;
            arglist.style = &amp;quot;font-style:normal&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if Config.state then&lt;br /&gt;
            slang = string.format( &amp;quot;%s-%s&amp;quot;, slang, Config.state )&lt;br /&gt;
        end&lt;br /&gt;
        if Config.scripting then&lt;br /&gt;
            slang = string.format( &amp;quot;%s-%s&amp;quot;, slang, Config.scripting )&lt;br /&gt;
        end&lt;br /&gt;
        r = Export.format( slang,&lt;br /&gt;
                           arglist.Text1,&lt;br /&gt;
                           arglist.style,&lt;br /&gt;
                           arglist.Audio,&lt;br /&gt;
                           arglist.class )&lt;br /&gt;
        if arglist.Text2 then&lt;br /&gt;
            local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                             :addClass( Config.site )&lt;br /&gt;
                             :attr( &amp;quot;lang&amp;quot;,&lt;br /&gt;
                                    string.format( &amp;quot;%s-%s&amp;quot;,&lt;br /&gt;
                                                   Config.slang,&lt;br /&gt;
                                                   Config.site ) )&lt;br /&gt;
                             :css( { [&amp;quot;font-weight&amp;quot;] = &amp;quot;normal&amp;quot; } )&lt;br /&gt;
                             :wikitext( arglist.Text2 )&lt;br /&gt;
                             if Config.site == &amp;quot;Latn&amp;quot; then&lt;br /&gt;
                                 s = &amp;quot;italic&amp;quot;&lt;br /&gt;
                             else&lt;br /&gt;
                                 s = &amp;quot;normal&amp;quot;&lt;br /&gt;
                             end&lt;br /&gt;
                             e:css( { [&amp;quot;font-style&amp;quot;] = s } )&lt;br /&gt;
            r    = string.format( &amp;quot;%s %s%s&amp;quot;,&lt;br /&gt;
                                  r,&lt;br /&gt;
                                  first( Config.site ),&lt;br /&gt;
                                  tostring( e ) )&lt;br /&gt;
            sep  = follow( Config.site )&lt;br /&gt;
            lone = false&lt;br /&gt;
        end&lt;br /&gt;
        if arglist.trans then&lt;br /&gt;
            local e&lt;br /&gt;
            for i = 1, #arglist.trans do&lt;br /&gt;
                e   = arglist.trans[ i ]&lt;br /&gt;
                r   = string.format( &amp;quot;%s%s %s&amp;quot;,&lt;br /&gt;
                                     r,&lt;br /&gt;
                                     sep,&lt;br /&gt;
                                     friend( e.system, e.story ) )&lt;br /&gt;
                sep = follow( Config.site )&lt;br /&gt;
            end   -- for i&lt;br /&gt;
            lone = false&lt;br /&gt;
        end&lt;br /&gt;
        if not Config.low then&lt;br /&gt;
            if Config.scripting then&lt;br /&gt;
                s = false&lt;br /&gt;
                if arglist[ Config.scripting ]  and&lt;br /&gt;
                   not arglist.Text2 then&lt;br /&gt;
                    Fetch( &amp;quot;ISO15924&amp;quot; )&lt;br /&gt;
                    if Config.ISO15924 then&lt;br /&gt;
                        s = Config.ISO15924&lt;br /&gt;
                                          .scriptName( Config.scripting )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if not s  and  Config.service then&lt;br /&gt;
                    s = facet( Config.service )&lt;br /&gt;
                end&lt;br /&gt;
            elseif Config.service then&lt;br /&gt;
                s = Config.service&lt;br /&gt;
            else&lt;br /&gt;
                s = false&lt;br /&gt;
            end&lt;br /&gt;
            if s then&lt;br /&gt;
                if arglist.later then&lt;br /&gt;
                    r    = string.format( &amp;quot;%s (%s)&amp;quot;, r, s )&lt;br /&gt;
                    lone = false&lt;br /&gt;
                else&lt;br /&gt;
                    r = string.format( &amp;quot;%s %s&amp;quot;, s, r )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if arglist.IPA then&lt;br /&gt;
            local params = { [1] = arglist.IPA }&lt;br /&gt;
            s    = Frame():expandTemplate{ title = Config.ipa,&lt;br /&gt;
                                           args  = params }&lt;br /&gt;
            r    = string.format( &amp;quot;%s [%s]&amp;quot;, r, s )&lt;br /&gt;
            sep  = follow()&lt;br /&gt;
            lone = false&lt;br /&gt;
        end&lt;br /&gt;
        if arglist.trsl then&lt;br /&gt;
            r = r .. foreigns( sep, arglist.trsl, lone )&lt;br /&gt;
        end&lt;br /&gt;
    elseif arglist.Text2 then&lt;br /&gt;
        r = fault( &amp;quot;errInvalid&amp;quot;, &amp;quot;|1=|2=&amp;quot;, true )&lt;br /&gt;
    else&lt;br /&gt;
        if Config.sole then&lt;br /&gt;
            r = Config.sole&lt;br /&gt;
        else&lt;br /&gt;
            r = Config.service&lt;br /&gt;
        end&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;
local function furnish( argsF, argsT )&lt;br /&gt;
    -- General entry point; basic argument consumption&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 parIgnore = { }&lt;br /&gt;
    local r = { }&lt;br /&gt;
    local s&lt;br /&gt;
    if argsF then&lt;br /&gt;
        if argsF.errHide ~= nil then&lt;br /&gt;
            Config.errHide = faculty( argsF.errHide )&lt;br /&gt;
        end&lt;br /&gt;
        Config.errCat     = argsF.errCat&lt;br /&gt;
        Config.errClasses = argsF.errClasses&lt;br /&gt;
        Config.errNS      = argsF.errNS&lt;br /&gt;
        if argsF.ELEMENT and argsF.ELEMENT:match( &amp;quot;^%a+$&amp;quot; ) then&lt;br /&gt;
            Config.scope = argsF.ELEMENT:lower()&lt;br /&gt;
        end&lt;br /&gt;
        if argsF.SUITABLE then&lt;br /&gt;
            local params = mw.text.split( argsF.SUITABLE, &amp;quot; &amp;quot;, true )&lt;br /&gt;
            for k, v in pairs( params ) do&lt;br /&gt;
                parIgnore[ v ] = true&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if Config.scripting == &amp;quot;&amp;quot; then&lt;br /&gt;
        Config.scripting = false&lt;br /&gt;
    end&lt;br /&gt;
    if Config.scripting then&lt;br /&gt;
        table.insert( Config.params, Config.scripting )&lt;br /&gt;
    end&lt;br /&gt;
    if type( argsT ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local n = table.maxn( Config.params )&lt;br /&gt;
        local script, unknown&lt;br /&gt;
        for k, v in pairs( argsT ) do&lt;br /&gt;
            v = flatten( v )&lt;br /&gt;
            s = type( k )&lt;br /&gt;
            if s == &amp;quot;number&amp;quot; then&lt;br /&gt;
                if Config.low then&lt;br /&gt;
                    k = k - 1&lt;br /&gt;
                end&lt;br /&gt;
                if k &amp;lt;= 2 then&lt;br /&gt;
                    if v then&lt;br /&gt;
                        if k == 0 then&lt;br /&gt;
                            k = false&lt;br /&gt;
                        else&lt;br /&gt;
                            if k == 1 then&lt;br /&gt;
                                r.Text1 = v&lt;br /&gt;
                                k       = false&lt;br /&gt;
                            elseif Config.scripting == Config.site then&lt;br /&gt;
                                k = &amp;quot;2&amp;quot;&lt;br /&gt;
                            else&lt;br /&gt;
                                r.Text2 = v&lt;br /&gt;
                                k       = false&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        if not Config.lenient then&lt;br /&gt;
                            -- LEGACY&lt;br /&gt;
                            k = string.format( &amp;quot;%s %s, |%d=&amp;quot;,&lt;br /&gt;
                                               &amp;quot;Sprachvorlage:&amp;quot;,&lt;br /&gt;
                                               factory( &amp;quot;errEmpty&amp;quot; ),&lt;br /&gt;
                                               k )&lt;br /&gt;
                            mw.addWarning( k )&lt;br /&gt;
                        end&lt;br /&gt;
                        k = false&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    k = tostring( k )&lt;br /&gt;
                end&lt;br /&gt;
            elseif parIgnore[ k ] then&lt;br /&gt;
                k = false&lt;br /&gt;
            elseif k:match( &amp;quot;^%l%l%l?%-?&amp;quot; ) then&lt;br /&gt;
                s = k:match( &amp;quot;^(%l%l%l?)$&amp;quot; )  or&lt;br /&gt;
                    k:match( &amp;quot;^(%l%l%l?)%-%u%u$&amp;quot; )  or&lt;br /&gt;
                    k:match( &amp;quot;^(%l%l%l?)%-%u%l%l%l$&amp;quot; )&lt;br /&gt;
                if v then&lt;br /&gt;
                    script = k:match( &amp;quot;^%l%l%l?%-(%u%l%l%l)$&amp;quot; )&lt;br /&gt;
                else&lt;br /&gt;
                    k = false&lt;br /&gt;
                end&lt;br /&gt;
                if v   and   s   and&lt;br /&gt;
                   ( s ~= Config.slang  or&lt;br /&gt;
                     script ~= Config.scripting ) then&lt;br /&gt;
                    local legal = mw.language.isSupportedLanguage( s )&lt;br /&gt;
                    if not legal then&lt;br /&gt;
                        legal = ( s ~= fill( s ) )&lt;br /&gt;
                    end&lt;br /&gt;
                    if legal then&lt;br /&gt;
                        local state = k:match( &amp;quot;^%l%l%l?%-(%u%u)$&amp;quot; )&lt;br /&gt;
                        local m&lt;br /&gt;
                        if s == Config.slang then&lt;br /&gt;
                            m = Config.keyBase&lt;br /&gt;
                        else&lt;br /&gt;
                            m = Config.keyTranslate&lt;br /&gt;
                        end&lt;br /&gt;
                        if not script then&lt;br /&gt;
                            script = fit( s )&lt;br /&gt;
                            if script then&lt;br /&gt;
                                k = string.format( &amp;quot;%s-%s&amp;quot;, s, script )&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                        if not r.trsl then&lt;br /&gt;
                            r.trsl = { }&lt;br /&gt;
                        end&lt;br /&gt;
                        table.insert( r.trsl,&lt;br /&gt;
                                      { m      = m,&lt;br /&gt;
                                        n      = #r.trsl + 1,&lt;br /&gt;
                                        script = script,&lt;br /&gt;
                                        short  = s,&lt;br /&gt;
                                        slang  = k,&lt;br /&gt;
                                        state  = state,&lt;br /&gt;
                                        story  = v } )&lt;br /&gt;
                        k = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif k:match( &amp;quot;^%u%u+%d*%.?%d*%-?%u*%d*$&amp;quot; ) then&lt;br /&gt;
                if familiar( k, Config.scripting )  or&lt;br /&gt;
                   familiar( k, Config.slang ) then&lt;br /&gt;
                    if v then&lt;br /&gt;
                        if not r.trans then&lt;br /&gt;
                            r.trans = { }&lt;br /&gt;
                        end&lt;br /&gt;
                        table.insert( r.trans,&lt;br /&gt;
                                      { system = k,&lt;br /&gt;
                                        story  = v } )&lt;br /&gt;
                    end&lt;br /&gt;
                    k = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif k:match( &amp;quot;^%u%l%l%l$&amp;quot; ) then&lt;br /&gt;
                if k == Config.scripting then&lt;br /&gt;
                    if faculty( v ) then&lt;br /&gt;
                        r[ k ] = true&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    if not r.trsl then&lt;br /&gt;
                        r.trsl = { }&lt;br /&gt;
                    end&lt;br /&gt;
                    table.insert( r.trsl,&lt;br /&gt;
                                  { m      = 100,&lt;br /&gt;
                                    n      = #r.trsl + 1,&lt;br /&gt;
                                    script = k,&lt;br /&gt;
                                    short  = Config.slang,&lt;br /&gt;
                                    slang  = string.format( &amp;quot;%s-%s&amp;quot;,&lt;br /&gt;
                                                            Config.slang,&lt;br /&gt;
                                                            k ),&lt;br /&gt;
                                    story  = v } )&lt;br /&gt;
                end&lt;br /&gt;
                k = false&lt;br /&gt;
            end&lt;br /&gt;
            if k then&lt;br /&gt;
                for i = 1, n do&lt;br /&gt;
                    if Config.params[ i ] == k then&lt;br /&gt;
                        if v then&lt;br /&gt;
                            r[ k ] = v&lt;br /&gt;
                        end&lt;br /&gt;
                        k = false&lt;br /&gt;
                        break -- for i&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
            if k then&lt;br /&gt;
                if not unknown then&lt;br /&gt;
                    unknown = { }&lt;br /&gt;
                end&lt;br /&gt;
                table.insert( unknown, k )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if r.demo  or  faculty( r.NoCat ) then&lt;br /&gt;
            Config.errCat  = 0&lt;br /&gt;
            Config.errHide = false&lt;br /&gt;
        end&lt;br /&gt;
        r.later = faculty( r.nachgestellt )&lt;br /&gt;
        if r.b and Config[ &amp;quot;OBSOLETING-bwd&amp;quot; ] then&lt;br /&gt;
            if r.de then&lt;br /&gt;
                r = fault( &amp;quot;errDoubled&amp;quot;, &amp;quot;'de=' und 'b='&amp;quot;, true )&lt;br /&gt;
            else&lt;br /&gt;
                r.de = r.b&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if r.w and Config[ &amp;quot;OBSOLETING-bwd&amp;quot; ] then&lt;br /&gt;
            if r.Text2 then&lt;br /&gt;
                r = fault( &amp;quot;errDoubled&amp;quot;, &amp;quot;'2=' und 'w='&amp;quot;, true )&lt;br /&gt;
            else&lt;br /&gt;
                r.Text2 = r.w&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if unknown then&lt;br /&gt;
            local e = mw.html.create( &amp;quot;code&amp;quot; )&lt;br /&gt;
                             :wikitext( table.concat( unknown, &amp;quot; &amp;quot; ) )&lt;br /&gt;
            r = fault( &amp;quot;errUnkown&amp;quot;,&lt;br /&gt;
                       string.format( &amp;quot;'%s'&amp;quot;,  tostring( e ) ),&lt;br /&gt;
                       true )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = full( r )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- furnish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.flat = function ( argsF, argsT, auxilary )&lt;br /&gt;
    -- Invocation of basic language template&lt;br /&gt;
    --     argsF     -- table, with #invoke parameters, or false&lt;br /&gt;
    --     argsT     -- table, with template parameters&lt;br /&gt;
    --     auxilary  -- Multilingual library, or false&lt;br /&gt;
    -- Returns appropriate string&lt;br /&gt;
    local r&lt;br /&gt;
    if type( auxilary ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        Config.Multilingual = auxilary&lt;br /&gt;
    else&lt;br /&gt;
        r = Fetch( &amp;quot;Multilingual&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if Config.Multilingual then&lt;br /&gt;
        local slang = argsT[ 1 ]&lt;br /&gt;
        local show  = argsT[ 2 ]&lt;br /&gt;
        if slang then&lt;br /&gt;
            slang = mw.text.trim( slang )&lt;br /&gt;
            if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
                slang = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if show then&lt;br /&gt;
            show = flatten( show )&lt;br /&gt;
        end&lt;br /&gt;
        if slang and show then&lt;br /&gt;
            local q = Config.Multilingual.getLang( slang )&lt;br /&gt;
            if q and q.legal then&lt;br /&gt;
                Config.lenient   = faculty( argsT.lenient )&lt;br /&gt;
                Config.low       = true&lt;br /&gt;
                Config.slang     = q.base&lt;br /&gt;
                Config.state     = q.region&lt;br /&gt;
                Config.scripting = q.script&lt;br /&gt;
                r = furnish( argsF, argsT )&lt;br /&gt;
            else&lt;br /&gt;
                local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                 :attr( &amp;quot;lang&amp;quot;, slang )&lt;br /&gt;
                                 :wikitext( show )&lt;br /&gt;
                local list = ( q and q.scream )&lt;br /&gt;
                local s&lt;br /&gt;
                if q and q.suggest then&lt;br /&gt;
                    local say = factory( &amp;quot;errSuggest&amp;quot; )&lt;br /&gt;
                    s = string.format( say, slang, q.suggest )&lt;br /&gt;
                else&lt;br /&gt;
                    s = slang&lt;br /&gt;
                end&lt;br /&gt;
                r = tostring( e ) ..&lt;br /&gt;
                    fault( &amp;quot;errInvalid&amp;quot;,  s,  not list )&lt;br /&gt;
                if list then&lt;br /&gt;
                    r = string.format( &amp;quot;%s[[Category:%s]]&amp;quot;, r, q.scream )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = fault( &amp;quot;errMissing&amp;quot;, false, true )&lt;br /&gt;
            if show then&lt;br /&gt;
                r = show .. r&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Export.flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.fold = function ( argsF, argsT )&lt;br /&gt;
    -- Invocation of RTL template&lt;br /&gt;
    --     argsF  -- table, with #invoke parameters, or false&lt;br /&gt;
    --     argsT  -- table, with template parameters&lt;br /&gt;
    -- Returns appropriate string, or nil&lt;br /&gt;
    local params = { }&lt;br /&gt;
    local r, s, slang&lt;br /&gt;
    for k, v in pairs( argsT ) do&lt;br /&gt;
        if v then&lt;br /&gt;
            v = mw.text.trim( v )&lt;br /&gt;
            if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                params[ k ] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if params[ 2 ] then&lt;br /&gt;
        s = params[ 2 ]:gsub( mw.ustring.char( 0x202A ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x202B ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x202C ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x202D ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x202E ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x2066 ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x2067 ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x2068 ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 0x2069 ), &amp;quot;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 8206 ), &amp;quot;&amp;amp;lrm;&amp;quot; )&lt;br /&gt;
                       :gsub( &amp;quot;&amp;amp;#0*8206;&amp;quot;,             &amp;quot;&amp;amp;lrm;&amp;quot; )&lt;br /&gt;
                       :gsub( &amp;quot;&amp;amp;#x0*200[Ee];&amp;quot;,         &amp;quot;&amp;amp;lrm;&amp;quot; )&lt;br /&gt;
                       :gsub( mw.ustring.char( 8207 ), &amp;quot;&amp;amp;rlm;&amp;quot; )&lt;br /&gt;
                       :gsub( &amp;quot;&amp;amp;#0*8207;&amp;quot;,             &amp;quot;&amp;amp;rlm;&amp;quot; )&lt;br /&gt;
                       :gsub( &amp;quot;&amp;amp;#x0*200[Ff];&amp;quot;,         &amp;quot;&amp;amp;rlm;&amp;quot; )&lt;br /&gt;
        if s:find( &amp;quot;&amp;amp;&amp;quot;, 1, true ) then&lt;br /&gt;
            local shift = &amp;quot;^&amp;amp;rlm;%s*&amp;quot;&lt;br /&gt;
            while s:match( shift ) do&lt;br /&gt;
                s = s:gsub( shift, &amp;quot;&amp;quot; )&lt;br /&gt;
            end -- while&lt;br /&gt;
            shift = &amp;quot;%s*&amp;amp;lrm;$&amp;quot;&lt;br /&gt;
            while s:match( shift ) do&lt;br /&gt;
                s = s:gsub( shift, &amp;quot;&amp;quot; )&lt;br /&gt;
            end -- while&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;
    end&lt;br /&gt;
    if s   and&lt;br /&gt;
       s:sub( 1, 5 ) == &amp;quot;&amp;lt;bdo &amp;quot;   and&lt;br /&gt;
       s:find( &amp;quot;^&amp;lt;bdo [^&amp;lt;&amp;gt;]+&amp;gt;&amp;lt;bdi [^&amp;lt;&amp;gt;]+&amp;gt;[^&amp;lt;&amp;gt;]+&amp;lt;/bdi&amp;gt;&amp;lt;/bdo&amp;gt;$&amp;quot; ) then&lt;br /&gt;
        r = s&lt;br /&gt;
        s = false&lt;br /&gt;
    end&lt;br /&gt;
    if s then&lt;br /&gt;
        local bdi    = mw.html.create( &amp;quot;bdi&amp;quot; )&lt;br /&gt;
                              :attr( &amp;quot;dir&amp;quot;, &amp;quot;rtl&amp;quot; )&lt;br /&gt;
                              :css( &amp;quot;unicode-bidi&amp;quot;, &amp;quot;isolate&amp;quot; )&lt;br /&gt;
                              :wikitext( s )&lt;br /&gt;
        local bdo    = mw.html.create( &amp;quot;bdo&amp;quot; )&lt;br /&gt;
                              :attr( &amp;quot;dir&amp;quot;, &amp;quot;ltr&amp;quot; )&lt;br /&gt;
        local slang  = params[ 1 ]&lt;br /&gt;
        local script = argsF.SCRIPTING&lt;br /&gt;
        local state  = argsF.STATE&lt;br /&gt;
        local selector&lt;br /&gt;
        family()&lt;br /&gt;
        if slang then&lt;br /&gt;
            if slang:find( &amp;quot;-&amp;quot;, 3, true ) then&lt;br /&gt;
                local parts = mw.text.split( slang, &amp;quot;-&amp;quot;, true )&lt;br /&gt;
                slang = parts[ 1 ]&lt;br /&gt;
                for i = 2, #parts do&lt;br /&gt;
                    if parts[ i ]:match( &amp;quot;^%u%u$&amp;quot; ) then&lt;br /&gt;
                        state = parts[ i ]&lt;br /&gt;
                    elseif parts[ i ]:match( &amp;quot;^%u%l%l%l$&amp;quot; ) then&lt;br /&gt;
                        script = parts[ i ]&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
            slang = slang:lower()&lt;br /&gt;
        else&lt;br /&gt;
            slang = &amp;quot;ar&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if script then&lt;br /&gt;
            first( script, bdo )&lt;br /&gt;
            features( bdi, script )&lt;br /&gt;
            selector = script&lt;br /&gt;
            if type( Config.classScript ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                selector = flag( selector, Config.classScript[ script ] )&lt;br /&gt;
            end&lt;br /&gt;
            s = string.format( &amp;quot;%s-%s&amp;quot;, slang, script )&lt;br /&gt;
        else&lt;br /&gt;
            s = slang&lt;br /&gt;
        end&lt;br /&gt;
        if state then&lt;br /&gt;
            s = string.format( &amp;quot;%s-%s&amp;quot;, s, state )&lt;br /&gt;
        end&lt;br /&gt;
        bdi:attr( &amp;quot;lang&amp;quot;, s )&lt;br /&gt;
        selector = flag( selector, argsF.class )&lt;br /&gt;
        selector = flag( selector, params.class )&lt;br /&gt;
        if selector then&lt;br /&gt;
            bdi:addClass( selector )&lt;br /&gt;
        end&lt;br /&gt;
        if argsF.css then&lt;br /&gt;
            bdi:css( argsF.css )&lt;br /&gt;
        end&lt;br /&gt;
        if argsF.style then&lt;br /&gt;
            bdi:cssText( argsF.style )&lt;br /&gt;
        end&lt;br /&gt;
        if params.style then&lt;br /&gt;
            bdi:cssText( params.style )&lt;br /&gt;
        end&lt;br /&gt;
        bdo:node( bdi )&lt;br /&gt;
        r = tostring( bdo )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Export.fold()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.format = function ( alien, apply, appear, audio, alike )&lt;br /&gt;
    -- Markup foreign language text&lt;br /&gt;
    --     alien   -- string, with language code&lt;br /&gt;
    --     apply   -- string, with text&lt;br /&gt;
    --     appear  -- string, with additional CSS, or nil&lt;br /&gt;
    --     audio   -- string, with title of an audio file, or nil&lt;br /&gt;
    --     alike   -- string, with additional class(es), or nil&lt;br /&gt;
    -- Returns appropriate string with HTML tag&lt;br /&gt;
    local ltr = true&lt;br /&gt;
    local r, script, selector, slang, state&lt;br /&gt;
    family()&lt;br /&gt;
    if alien:find( &amp;quot;-&amp;quot;, 3, true ) then&lt;br /&gt;
        local parts = mw.text.split( alien, &amp;quot;-&amp;quot;, true )&lt;br /&gt;
        slang = parts[ 1 ]&lt;br /&gt;
        for i = 2, #parts do&lt;br /&gt;
            if parts[ i ]:match( &amp;quot;^%u%u$&amp;quot; ) then&lt;br /&gt;
                state = parts[ i ]&lt;br /&gt;
            elseif parts[ i ]:match( &amp;quot;^%u%l%l%l$&amp;quot; ) then&lt;br /&gt;
                script = parts[ i ]&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
    else&lt;br /&gt;
        slang = alien&lt;br /&gt;
    end&lt;br /&gt;
    slang = slang:lower()&lt;br /&gt;
    if not script then&lt;br /&gt;
        script = fit( slang )&lt;br /&gt;
    end&lt;br /&gt;
    if script then&lt;br /&gt;
        local rtl = Friend().rtl&lt;br /&gt;
        if type( rtl ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            ltr = not rtl[ script ]&lt;br /&gt;
        end&lt;br /&gt;
        if script ~= Config.site then&lt;br /&gt;
            selector = script&lt;br /&gt;
            if type( Config.classScript ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                selector = flag( selector, Config.classScript[ script ] )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    selector = flag( selector, alike )&lt;br /&gt;
    if ltr then&lt;br /&gt;
        local scope = Config.scope or &amp;quot;span&amp;quot;&lt;br /&gt;
        local elem = mw.html.create( scope )&lt;br /&gt;
        local story = apply&lt;br /&gt;
        local set&lt;br /&gt;
        if script then&lt;br /&gt;
            set = string.format( &amp;quot;%s-%s&amp;quot;, slang, script )&lt;br /&gt;
            features( elem, script )&lt;br /&gt;
        else&lt;br /&gt;
            set = slang&lt;br /&gt;
        end&lt;br /&gt;
        if state then&lt;br /&gt;
            set = string.format( &amp;quot;%s-%s&amp;quot;, set, state )&lt;br /&gt;
        end&lt;br /&gt;
        elem:attr( &amp;quot;lang&amp;quot;, set )&lt;br /&gt;
        if selector then&lt;br /&gt;
            elem:addClass( selector )&lt;br /&gt;
        end&lt;br /&gt;
        if appear then&lt;br /&gt;
            elem:cssText( appear )&lt;br /&gt;
        end&lt;br /&gt;
        if scope == &amp;quot;span&amp;quot; then&lt;br /&gt;
            story = story:gsub( &amp;quot;\n&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
        elem:wikitext( story )&lt;br /&gt;
        r = tostring( elem )&lt;br /&gt;
        if script  and  script ~= Config.site then&lt;br /&gt;
            local lucky, x = pcall( require,&lt;br /&gt;
                                    &amp;quot;Module:Vorlage:lang/Zwiebelfisch&amp;quot; )&lt;br /&gt;
            r = first( script ) .. r&lt;br /&gt;
            if type( x ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
               type( x.finder ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                x = x.finder( apply, script )&lt;br /&gt;
                if type( x ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                    r = r .. x&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = Export.fold( { SCRIPTING = script },&lt;br /&gt;
                         { [ 1 ] = slang,&lt;br /&gt;
                           [ 2 ] = apply,&lt;br /&gt;
                           class = selector,&lt;br /&gt;
                           style = appear } )&lt;br /&gt;
    end&lt;br /&gt;
    if mw.text.unstrip( apply ):sub( 1, 1 ) == &amp;quot;&amp;lt;&amp;quot; then&lt;br /&gt;
        local seek = &amp;quot;^(&amp;lt;([sd][paniv]+) [^&amp;gt;]+&amp;gt;)%1(.+)(&amp;lt;/%2&amp;gt;)%4$&amp;quot;&lt;br /&gt;
        local s, start, story, stop&lt;br /&gt;
        start, s, story, stop = mw.text.unstrip( r ):match( seek )&lt;br /&gt;
        if story then&lt;br /&gt;
            r = Export.format( slang, story, appear, audio, alike )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if audio and Config.tmplAudio then&lt;br /&gt;
        local params = { [ Config.tmplAudio.filepar ] = audio,&lt;br /&gt;
                         [ Config.tmplAudio.textpar ] = r }&lt;br /&gt;
        r = Frame():expandTemplate{ title = Config.tmplAudio.title,&lt;br /&gt;
                                    args  = params }&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- Export.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Export.full = function ( argsF, argsT )&lt;br /&gt;
    -- Invocation of language name template&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;
    if argsF then&lt;br /&gt;
        Config.lenient   = faculty( argsF.lenient )&lt;br /&gt;
        Config.long      = faculty( argsF.LONG )&lt;br /&gt;
        Config.scripting = argsF.SCRIPTING&lt;br /&gt;
        Config.service   = argsF.SERVICE&lt;br /&gt;
        Config.slang     = argsF.CODE&lt;br /&gt;
        Config.sole      = argsF.SOLE&lt;br /&gt;
        if argsF[&amp;quot;OBSOLETING-bwd&amp;quot;] then&lt;br /&gt;
            table.insert( Config.params, &amp;quot;b&amp;quot; )&lt;br /&gt;
            table.insert( Config.params, &amp;quot;d&amp;quot; )&lt;br /&gt;
            table.insert( Config.params, &amp;quot;w&amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    Config.low = false&lt;br /&gt;
    return furnish( argsF, argsT )&lt;br /&gt;
end -- Export.full()&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;
    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 vsn = entity: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;
                    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;
&lt;br /&gt;
p.test = function ( action, argsF, argsT )&lt;br /&gt;
    --     action  -- string, &amp;quot;flat&amp;quot; or &amp;quot;full&amp;quot; etc.&lt;br /&gt;
    --     argsF   -- table, with #invoke parameters, or false&lt;br /&gt;
    --     argsT   -- table, with template parameters&lt;br /&gt;
    return frontend( action, argsF, argsT )&lt;br /&gt;
end -- p.test()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.flat = function ( frame )&lt;br /&gt;
    return frontier( frame, &amp;quot;flat&amp;quot; )&lt;br /&gt;
end -- p.flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.fold = function ( frame )&lt;br /&gt;
    return frontier( frame, &amp;quot;fold&amp;quot; )  or   &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.fold()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.full = function ( frame )&lt;br /&gt;
    return frontier( frame, &amp;quot;full&amp;quot; )&lt;br /&gt;
end -- p.full()&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
&lt;br /&gt;
p.lang = function ()&lt;br /&gt;
    return Export&lt;br /&gt;
end -- p.lang()&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Text/quoting&amp;diff=396</id>
		<title>Modul:Text/quoting</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Text/quoting&amp;diff=396"/>
		<updated>2022-02-23T14:42:27Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local TextQuote = { serial = &amp;quot;2021-05-01&amp;quot;,&lt;br /&gt;
                    suite  = &amp;quot;TextQuote&amp;quot;,&lt;br /&gt;
                    item   = 75029538 }&lt;br /&gt;
--[=[&lt;br /&gt;
Text utilities: quotes for particular languages&lt;br /&gt;
mw.loadData() table with all known assignments&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TextQuote.langs = { af        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    ar        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    be        = &amp;quot;labd&amp;quot;,&lt;br /&gt;
                    bg        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    ca        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    cs        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    da        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    de        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    dsb       = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    et        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    el        = &amp;quot;lald&amp;quot;,&lt;br /&gt;
                    en        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    eo        = &amp;quot;bdla&amp;quot;,&lt;br /&gt;
                    es        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    eu        = &amp;quot;la&amp;quot;,&lt;br /&gt;
              --    fa        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    fi        = &amp;quot;rd&amp;quot;,&lt;br /&gt;
                    fr        = &amp;quot;laSPC&amp;quot;,&lt;br /&gt;
                    ga        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    grc       = &amp;quot;lald&amp;quot;,&lt;br /&gt;
                    he        = &amp;quot;ldla&amp;quot;,&lt;br /&gt;
                    hr        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    hsb       = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    hu        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    hy        = &amp;quot;labd&amp;quot;,&lt;br /&gt;
                    id        = &amp;quot;rd&amp;quot;,&lt;br /&gt;
                    is        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    it        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    ja        = &amp;quot;x300C&amp;quot;,&lt;br /&gt;
                    ka        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    ko        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    lt        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    lv        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    nl        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    nn        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    no        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    pl        = &amp;quot;bxla&amp;quot;,&lt;br /&gt;
                    pt        = &amp;quot;lald&amp;quot;,&lt;br /&gt;
                    ro        = &amp;quot;bdla&amp;quot;,&lt;br /&gt;
                    ru        = &amp;quot;labd&amp;quot;,&lt;br /&gt;
                    sk        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    sl        = &amp;quot;bd&amp;quot;,&lt;br /&gt;
                    sq        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    sr        = &amp;quot;bx&amp;quot;,&lt;br /&gt;
                    sv        = &amp;quot;rd&amp;quot;,&lt;br /&gt;
                    th        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    tr        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    uk        = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    zh        = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    [&amp;quot;de-ch&amp;quot;] = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    [&amp;quot;en-gb&amp;quot;] = &amp;quot;lsld&amp;quot;,&lt;br /&gt;
                    [&amp;quot;en-us&amp;quot;] = &amp;quot;ld&amp;quot;,&lt;br /&gt;
                    [&amp;quot;fr-ch&amp;quot;] = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    [&amp;quot;it-ch&amp;quot;] = &amp;quot;la&amp;quot;,&lt;br /&gt;
                    [&amp;quot;pt-br&amp;quot;] = &amp;quot;ldla&amp;quot;,&lt;br /&gt;
                    [&amp;quot;zh-tw&amp;quot;] = &amp;quot;x300C&amp;quot;,&lt;br /&gt;
                    [&amp;quot;zh-cn&amp;quot;] = &amp;quot;ld&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TextQuote.types = { bd    = { { 8222, 8220 },  { 8218, 8217 } },&lt;br /&gt;
                    bdla  = { { 8222, 8220 },  {  171,  187 } },&lt;br /&gt;
                    bx    = { { 8222, 8221 },  { 8218, 8217 } },&lt;br /&gt;
                    bxla  = { { 8222, 8221 },  {  171,  187 } },&lt;br /&gt;
                    la    = { {  171,  187 },  { 8249, 8250 } },&lt;br /&gt;
                    laSPC = { {  171,  187 },  { 8249, 8250 },  true },&lt;br /&gt;
                    labd  = { {  171,  187 },  { 8222, 8220 } },&lt;br /&gt;
                    lald  = { {  171,  187 },  { 8220, 8221 } },&lt;br /&gt;
                    ld    = { { 8220, 8221 },  { 8216, 8217 } },&lt;br /&gt;
                    ldla  = { { 8220, 8221 },  {  171,  187 } },&lt;br /&gt;
                    lsld  = { { 8216, 8217 },  { 8220, 8221 } },&lt;br /&gt;
                    rd    = { { 8221, 8221 },  { 8217, 8217 } },&lt;br /&gt;
                    x300C = { { 0x300C, 0x300D },&lt;br /&gt;
                              { 0x300E, 0x300F } } }&lt;br /&gt;
                  -- each element is a table with elements:&lt;br /&gt;
                  -- [1]  table, with opening and closing quote&lt;br /&gt;
                  -- [2]  optional: table, opening and closing 2nd quote&lt;br /&gt;
                  -- [3]  optional: boolean,&lt;br /&gt;
                  --                space between quote and text&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TextQuote.failsafe = serial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return  TextQuote&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:TemplateData/config&amp;diff=394</id>
		<title>Modul:TemplateData/config</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:TemplateData/config&amp;diff=394"/>
		<updated>2022-02-23T14:42:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Serial = &amp;quot;2021-03-08&amp;quot;&lt;br /&gt;
--[=[&lt;br /&gt;
dewiki-Konfiguration {{TemplateData}}&lt;br /&gt;
mw.loadData()&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return { catProblem    = &amp;quot;Wikipedia:Vorlagenfehler/Vorlage:TemplateData&amp;quot;,&lt;br /&gt;
         classNoNumTOC = &amp;quot;nonumtoc&amp;quot;,&lt;br /&gt;
         classTable    = { &amp;quot;wikitable&amp;quot;, &amp;quot;templatedata-params&amp;quot; },&lt;br /&gt;
         cssParWrap    = { [&amp;quot;margin-left&amp;quot;]  = &amp;quot;-1em&amp;quot;,&lt;br /&gt;
                           [&amp;quot;margin-right&amp;quot;] = &amp;quot;-1em&amp;quot; },&lt;br /&gt;
         cssParams     = { [&amp;quot;border&amp;quot;]       = &amp;quot;#B3B7FF 1px solid&amp;quot;,&lt;br /&gt;
                           [&amp;quot;margin-left&amp;quot;]  = &amp;quot;auto&amp;quot;,&lt;br /&gt;
                           [&amp;quot;margin-right&amp;quot;] = &amp;quot;auto&amp;quot; },&lt;br /&gt;
         docpageCreate = &amp;quot;%s/Doku&amp;quot;,&lt;br /&gt;
         docpageDetect = &amp;quot;/Doku$&amp;quot;,&lt;br /&gt;
         helpBoolean   = &amp;quot;Hilfe:TemplateData/Anwendung‎#boolean&amp;quot;,&lt;br /&gt;
         helpContent   = &amp;quot;Hilfe:TemplateData/Anwendung‎#wikitext&amp;quot;,&lt;br /&gt;
         helpDate      = &amp;quot;Hilfe:TemplateData/Anwendung‎#date&amp;quot;,&lt;br /&gt;
         helpFile      = &amp;quot;Hilfe:TemplateData/Anwendung‎#file&amp;quot;,&lt;br /&gt;
         helpFormat    = &amp;quot;Hilfe:TemplateData/Anwendung‎#layout&amp;quot;,&lt;br /&gt;
         helpLine      = &amp;quot;Hilfe:TemplateData/Anwendung‎#line&amp;quot;,&lt;br /&gt;
         helpNumber    = &amp;quot;Hilfe:TemplateData/Anwendung‎#number&amp;quot;,&lt;br /&gt;
         helpPage      = &amp;quot;Hilfe:TemplateData/Anwendung‎#page&amp;quot;,&lt;br /&gt;
         helpString    = &amp;quot;Hilfe:TemplateData/Anwendung‎#string&amp;quot;,&lt;br /&gt;
         helpTemplate  = &amp;quot;Hilfe:TemplateData/Anwendung‎#template&amp;quot;,&lt;br /&gt;
         helpURL       = &amp;quot;Hilfe:TemplateData/Anwendung‎#url&amp;quot;,&lt;br /&gt;
         helpUser      = &amp;quot;Hilfe:TemplateData/Anwendung‎#user&amp;quot;,&lt;br /&gt;
         msgDescMiss   = &amp;quot;Beschreibung fehlt&amp;quot;,&lt;br /&gt;
         permit        = {  },&lt;br /&gt;
         tStylesTOCnum = &amp;quot;TOC nonum&amp;quot;, &lt;br /&gt;
         serial        = Serial }&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:TemplUtl&amp;diff=392</id>
		<title>Modul:TemplUtl</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:TemplUtl&amp;diff=392"/>
		<updated>2022-02-23T14:42:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local TemplUtl = { suite  = &amp;quot;TemplUtl&amp;quot;,&lt;br /&gt;
                   serial = &amp;quot;2021-01-01&amp;quot;,&lt;br /&gt;
                   item   = 52364930 };&lt;br /&gt;
--[=[&lt;br /&gt;
Utilities to support template programming.&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe = TemplUtl;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fallible = function ( adjust, ahead )&lt;br /&gt;
    -- Check for leading character disturbing syntax&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    adjust  -- string; trimmed wikitext&lt;br /&gt;
    --    ahead   -- true, if leading syntax shall start on new line&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string, modified if necessary&lt;br /&gt;
    local r = adjust;&lt;br /&gt;
    local c = r:byte( 1, 1 );&lt;br /&gt;
    if c &amp;lt;= 59  and&lt;br /&gt;
       ( c==35 or c==42 or c==58 or c==59 ) then&lt;br /&gt;
        if ahead then&lt;br /&gt;
            r = &amp;quot;\n&amp;quot; .. r;&lt;br /&gt;
        else&lt;br /&gt;
            r = mw.text.nowiki( r:sub( 1, 1 ) )  ..  r:sub( 2 );&lt;br /&gt;
        end&lt;br /&gt;
    elseif ahead then&lt;br /&gt;
        local c2 = r:byte( 2, 1 );&lt;br /&gt;
        if ( c==123 and c2==124 )   or&lt;br /&gt;
           ( c==124 and c2==45 ) then&lt;br /&gt;
            r = &amp;quot;\n&amp;quot; .. r;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- fallible()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fiatTitleRegExp = function ( accept )&lt;br /&gt;
    -- Create pattern to detect page name&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     accept  -- string; trimmed title&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string with pattern&lt;br /&gt;
    local start = mw.ustring.sub( accept, 1, 1 );&lt;br /&gt;
    local r;&lt;br /&gt;
    if mw.ustring.match( start, &amp;quot;%a&amp;quot; ) then&lt;br /&gt;
        r = string.format( &amp;quot;[%s%s]%s&amp;quot;,&lt;br /&gt;
                           mw.ustring.lower( start ),&lt;br /&gt;
                           mw.ustring.upper( start ),&lt;br /&gt;
                           mw.ustring.sub( accept, 2 ) );&lt;br /&gt;
    else&lt;br /&gt;
        r = accept;&lt;br /&gt;
    end&lt;br /&gt;
    if r:match( &amp;quot; &amp;quot; ) then&lt;br /&gt;
        r = r: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;
             :gsub( &amp;quot;_&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;%s+&amp;quot;, &amp;quot;[%s_]+&amp;quot; );&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- fiatTitleRegExp()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local framing = function ( frame )&lt;br /&gt;
    -- Ensure availability of frame object&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     frame  -- object; #invoke environment, or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Return frame object&lt;br /&gt;
    if not TemplUtl.frame then&lt;br /&gt;
        if type( frame ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            TemplUtl.frame = frame;&lt;br /&gt;
        else&lt;br /&gt;
            TemplUtl.frame = mw.getCurrentFrame();&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return TemplUtl.frame;&lt;br /&gt;
end -- framing()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.faculty = function ( analyze, another )&lt;br /&gt;
    -- Test template arg for boolean&lt;br /&gt;
    --     analyze  -- string, boolean, number or nil&lt;br /&gt;
    --     another  -- fallback: string, boolean, or nil&lt;br /&gt;
    --                 &amp;quot;-&amp;quot; to test for explicit vocabulary choice&lt;br /&gt;
    -- Returns boolean, or &amp;quot;-&amp;quot;&lt;br /&gt;
    local s = type( analyze );&lt;br /&gt;
    local r;&lt;br /&gt;
    if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( analyze );&lt;br /&gt;
        if r == &amp;quot;&amp;quot;  then&lt;br /&gt;
            r = TemplUtl.faculty( another, nil );&lt;br /&gt;
        elseif r:find( &amp;quot;1&amp;quot;, 1, true )  and&lt;br /&gt;
               r:match( &amp;quot;^[0%-]*1[01%-]*$&amp;quot; ) then&lt;br /&gt;
            r = true;&lt;br /&gt;
        elseif r:match( &amp;quot;^[0%-]+$&amp;quot; ) then&lt;br /&gt;
            r = false;&lt;br /&gt;
        else&lt;br /&gt;
            r = r:lower();&lt;br /&gt;
            if r == &amp;quot;y&amp;quot;  or&lt;br /&gt;
               r == &amp;quot;yes&amp;quot;  or&lt;br /&gt;
               r == &amp;quot;true&amp;quot;  or&lt;br /&gt;
               r == &amp;quot;on&amp;quot; then&lt;br /&gt;
                r = true;&lt;br /&gt;
            elseif r == &amp;quot;n&amp;quot;  or&lt;br /&gt;
                   r == &amp;quot;no&amp;quot;  or&lt;br /&gt;
                   r == &amp;quot;false&amp;quot;  or&lt;br /&gt;
                   r == &amp;quot;off&amp;quot; then&lt;br /&gt;
                r = false;&lt;br /&gt;
            else&lt;br /&gt;
                if not TemplUtl.boolang then&lt;br /&gt;
                    -- TODO: page language&lt;br /&gt;
                    local l, d = pcall( mw.ext.data.get, &amp;quot;i18n/01.tab&amp;quot; );&lt;br /&gt;
                    if type( d ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                       type( d.data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                        local f = function ( at )&lt;br /&gt;
                                  local e = d.data[ at ];&lt;br /&gt;
                                  l = e[ 1 ];&lt;br /&gt;
                                  s = e[ 2 ];&lt;br /&gt;
                                  if type( l ) == &amp;quot;boolean&amp;quot;  and&lt;br /&gt;
                                     type( s ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                                      s = mw.text.split( s, &amp;quot;|&amp;quot; );&lt;br /&gt;
                                      for i = 1, #s do&lt;br /&gt;
                                          TemplUtl.boolang[ s[ i ] ] = l;&lt;br /&gt;
                                      end -- for i&lt;br /&gt;
                                  end&lt;br /&gt;
                              end&lt;br /&gt;
                        TemplUtl.boolang = { };&lt;br /&gt;
                        f( 1 );&lt;br /&gt;
                        f( 2 );&lt;br /&gt;
                    else&lt;br /&gt;
                        TemplUtl.boolang = true;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if type( TemplUtl.boolang ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    s = TemplUtl.boolang[ r ];&lt;br /&gt;
                    if type( s ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                        r = s;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if type( r ) ~= &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                    s = type( another );&lt;br /&gt;
                    if s == &amp;quot;nil&amp;quot; then&lt;br /&gt;
                        r = true;&lt;br /&gt;
                    elseif s == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                        r = another;&lt;br /&gt;
                    elseif another == &amp;quot;-&amp;quot; then&lt;br /&gt;
                        r = &amp;quot;-&amp;quot;;&lt;br /&gt;
                    else&lt;br /&gt;
                        r = TemplUtl.faculty( another );&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif s == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
        r = analyze;&lt;br /&gt;
    elseif s == &amp;quot;number&amp;quot; then&lt;br /&gt;
        r = ( analyze ~= 0 );&lt;br /&gt;
    else&lt;br /&gt;
        r = false;&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- TemplUtl.faculty()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.failure = function ( alert, always, addClass, frame )&lt;br /&gt;
    -- Format error message, mostly hidden&lt;br /&gt;
    --     alert     -- string: message&lt;br /&gt;
    --     always    -- boolean, or nil: do not hide&lt;br /&gt;
    --     addClass  -- string, or nil: add classes to element&lt;br /&gt;
    --     frame     -- object, or nil&lt;br /&gt;
    -- Returns string&lt;br /&gt;
    local err  = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                        :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                        :wikitext( alert );&lt;br /&gt;
    local live = ( framing( frame ):preprocess( &amp;quot;{{REVISIONID}}&amp;quot; )&lt;br /&gt;
                   == &amp;quot;&amp;quot; );&lt;br /&gt;
    if type( addClass ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        err:addClass( addClass )&lt;br /&gt;
    end&lt;br /&gt;
    if live then&lt;br /&gt;
        local max  = 1000000000;&lt;br /&gt;
        local id   = math.floor( os.clock() * max );&lt;br /&gt;
        local sign = string.format( &amp;quot;error_%d&amp;quot;, id );&lt;br /&gt;
        local btn  = mw.html.create( &amp;quot;span&amp;quot; );&lt;br /&gt;
        local top  = mw.html.create( &amp;quot;div&amp;quot; );&lt;br /&gt;
        err:attr( &amp;quot;id&amp;quot;, sign );&lt;br /&gt;
        -- TODO: LTR&lt;br /&gt;
        btn:css( { [&amp;quot;background&amp;quot;]      = &amp;quot;#FFFF00&amp;quot;,&lt;br /&gt;
                   [&amp;quot;border&amp;quot;]          = &amp;quot;#FF0000 3px solid&amp;quot;,&lt;br /&gt;
                   [&amp;quot;font-weight&amp;quot;]     = &amp;quot;bold&amp;quot;,&lt;br /&gt;
                   [&amp;quot;padding&amp;quot;]         = &amp;quot;2px&amp;quot;,&lt;br /&gt;
                   [&amp;quot;text-decoration&amp;quot;] = &amp;quot;none&amp;quot; } )&lt;br /&gt;
           :wikitext( &amp;quot;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;quot; );&lt;br /&gt;
        sign = string.format( &amp;quot;[[#%s|%s]]&amp;quot;,  sign,  tostring( btn ) );&lt;br /&gt;
        top:wikitext( sign, &amp;quot;&amp;amp;#160;&amp;quot;, alert );&lt;br /&gt;
        mw.addWarning( tostring( top:attr( &amp;quot;role&amp;quot;, &amp;quot;alert&amp;quot; ) ) );&lt;br /&gt;
    elseif not always then&lt;br /&gt;
        err:css( { [&amp;quot;display&amp;quot;]     = &amp;quot;none&amp;quot; } );&lt;br /&gt;
--      err:css( { [&amp;quot;display&amp;quot;]     = &amp;quot;inline-block&amp;quot;,&lt;br /&gt;
--                 [&amp;quot;line-height&amp;quot;] = &amp;quot;0&amp;quot;,&lt;br /&gt;
--                 [&amp;quot;max-height&amp;quot;]  = &amp;quot;0&amp;quot;,&lt;br /&gt;
--                 [&amp;quot;max-width&amp;quot;]   = &amp;quot;0&amp;quot;,&lt;br /&gt;
--                 [&amp;quot;visibility&amp;quot;]  = &amp;quot;hidden&amp;quot; } );&lt;br /&gt;
    end&lt;br /&gt;
    return tostring( err );&lt;br /&gt;
end -- TemplUtl.failure()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.fake = function ( access )&lt;br /&gt;
    -- Simulation of template transclusion&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    access  -- string; page name (template)&lt;br /&gt;
    if type( access ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local s = mw.text.trim( access );&lt;br /&gt;
        if s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local t = mw.title.new( s, 10 );&lt;br /&gt;
            if not mw.title.equals( mw.title.getCurrentTitle(), t )  and&lt;br /&gt;
               t.exists then&lt;br /&gt;
                t:getContent();&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end -- TemplUtl.fake()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.fakes = function ( array, frame, ahead, answer )&lt;br /&gt;
    -- Simulation of template transclusions&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    array   -- table, with template title strings&lt;br /&gt;
    --    frame   -- object, or nil&lt;br /&gt;
    --    ahead   -- string, or nil, with common prefix&lt;br /&gt;
    --    answer  -- true, or nil, for list creation&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string, if answer requested&lt;br /&gt;
    local e = framing( frame );&lt;br /&gt;
    local f = function ( a )&lt;br /&gt;
                  e:expandTemplate{ title = a };&lt;br /&gt;
              end&lt;br /&gt;
    local s = ahead or &amp;quot;&amp;quot;;&lt;br /&gt;
    local r;&lt;br /&gt;
    for k, v in pairs( array ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; and&lt;br /&gt;
           type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            v = s .. mw.text.trim( v );&lt;br /&gt;
            pcall( f, v );&lt;br /&gt;
            if answer then&lt;br /&gt;
                if r then&lt;br /&gt;
                    r = r .. &amp;quot;\n&amp;quot;;&lt;br /&gt;
                else&lt;br /&gt;
                    r = &amp;quot;&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
                r = string.format( &amp;quot;%s* [[Template:%s|%s]]&amp;quot;, r, v, v );&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    return r;&lt;br /&gt;
end -- TemplUtl.fakes()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.feasible = function ( address )&lt;br /&gt;
    -- Does this describe an URL beginning?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    address  -- string; what to inspect, URL presumed&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns true, if URL beginning&lt;br /&gt;
    local start, r = address:match( &amp;quot;^%s*((%a*:?)//)&amp;quot; );&lt;br /&gt;
    if start then&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = true;&lt;br /&gt;
        elseif r:sub( -1, -1 ) == &amp;quot;:&amp;quot; then&lt;br /&gt;
            local schemes = &amp;quot;:ftp:ftps:http:https:&amp;quot;;&lt;br /&gt;
            r = &amp;quot;:&amp;quot; .. r:lower();&lt;br /&gt;
            if schemes:find( r, 1, true ) then&lt;br /&gt;
                r = true;&lt;br /&gt;
            else&lt;br /&gt;
                r = false;&lt;br /&gt;
            end&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 -- TemplUtl.feasible()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.feed = function ( area, ahead, at, after )&lt;br /&gt;
    -- Detect next free &amp;quot;|&amp;quot; or &amp;quot;}}&amp;quot;&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area   -- string; template transclusion&lt;br /&gt;
    --     ahead  -- string; opening element, or false&lt;br /&gt;
    --     at     -- number; byte position in area where to start&lt;br /&gt;
    --     after  -- true, if only to search for &amp;quot;}}&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns&lt;br /&gt;
    --          -- number; byte position in area&lt;br /&gt;
    --             -- before &amp;quot;|&amp;quot; or &amp;quot;}}&amp;quot;, may be at end&lt;br /&gt;
    --             -- to continue search; ahead has been closed&lt;br /&gt;
    --          -- true, if to be continued at number&lt;br /&gt;
    local j    = at;&lt;br /&gt;
    local loop = true;&lt;br /&gt;
    local c, k, r, s, seek;&lt;br /&gt;
    if after then&lt;br /&gt;
        seek = &amp;quot;[{}&amp;lt;]&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        seek = &amp;quot;[%[%]|{}&amp;lt;:]&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    while loop do&lt;br /&gt;
        j = area:find( seek, j );&lt;br /&gt;
        if j then&lt;br /&gt;
            c = area:byte( j, j );&lt;br /&gt;
            if c == 123 then    -- {&lt;br /&gt;
                k = j + 1;&lt;br /&gt;
                if area:byte( k, k ) == 123 then&lt;br /&gt;
                    k = k + 1;&lt;br /&gt;
                    if area:byte( k, k ) == 123 then&lt;br /&gt;
                        j, loop = TemplUtl.feed( area, &amp;quot;{{{&amp;quot;, k, after );&lt;br /&gt;
                    else&lt;br /&gt;
                        k = k - 1;&lt;br /&gt;
                        j, loop = TemplUtl.feed( area, &amp;quot;{{&amp;quot;, k, after );&lt;br /&gt;
                    end&lt;br /&gt;
                    if not loop then&lt;br /&gt;
                        r = j;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 125 then    -- }&lt;br /&gt;
                k = j + 1;&lt;br /&gt;
                if area:byte( k, k ) == 125 then&lt;br /&gt;
                    if ahead == &amp;quot;{{&amp;quot; then&lt;br /&gt;
                        r = k;&lt;br /&gt;
                        break;    -- while loop;&lt;br /&gt;
                    elseif ahead == &amp;quot;{{{&amp;quot; then&lt;br /&gt;
                        k = k + 1;&lt;br /&gt;
                        if area:byte( k, k ) == 125 then&lt;br /&gt;
                            r = k;&lt;br /&gt;
                            break;    -- while loop;&lt;br /&gt;
                        end&lt;br /&gt;
                    elseif not ahead then&lt;br /&gt;
                        r    = j - 1;&lt;br /&gt;
                        loop = false;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 60 then    -- &amp;lt;&lt;br /&gt;
                k = j + 3;&lt;br /&gt;
                if area:sub( j, k ) == &amp;quot;&amp;lt;!--&amp;quot; then&lt;br /&gt;
                    k = area:find( &amp;quot;--&amp;gt;&amp;quot;, k );&lt;br /&gt;
                    if k then&lt;br /&gt;
                        j = k + 2;&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    local skip;&lt;br /&gt;
                    s    = area:sub( j + 1 ):lower();&lt;br /&gt;
                    skip = s:match( &amp;quot;^%s*nowiki%s*&amp;gt;&amp;quot; );&lt;br /&gt;
                    if skip then&lt;br /&gt;
                        local n = skip:len();&lt;br /&gt;
                        n, k = s:find( &amp;quot;&amp;lt;%s*/%s*nowiki%s*&amp;gt;&amp;quot;, n );&lt;br /&gt;
                        if k then&lt;br /&gt;
                            j = j + k;&lt;br /&gt;
                        else&lt;br /&gt;
                            loop = false;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 124 then    -- |&lt;br /&gt;
                if not r then&lt;br /&gt;
                    r = j - 1;&lt;br /&gt;
                end&lt;br /&gt;
                if not ahead then&lt;br /&gt;
                    loop = false;&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 91 then    -- [&lt;br /&gt;
                k = j + 1;&lt;br /&gt;
                if area:byte( k, k ) == 91 then&lt;br /&gt;
                    k = k + 1;&lt;br /&gt;
                    j, loop = TemplUtl.feed( area, &amp;quot;[[&amp;quot;, k, after );&lt;br /&gt;
                elseif TemplUtl.feasible( area:sub( k ) ) then&lt;br /&gt;
                    k = k + 3;&lt;br /&gt;
                    j, loop = TemplUtl.feed( area, &amp;quot;[&amp;quot;, k, after );&lt;br /&gt;
                end&lt;br /&gt;
                if not loop then&lt;br /&gt;
                    r = j;&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 93 then    -- ]&lt;br /&gt;
                if ahead == &amp;quot;[&amp;quot; then&lt;br /&gt;
                    r = j;&lt;br /&gt;
                    break;    -- while loop&lt;br /&gt;
                elseif ahead == &amp;quot;[[&amp;quot; then&lt;br /&gt;
                    k = j + 1;&lt;br /&gt;
                    if area:byte( k, k ) == 93 then&lt;br /&gt;
                        r = k;&lt;br /&gt;
                        break;    -- while loop&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif c == 58 then    -- :&lt;br /&gt;
                s = area:sub( j + 1,  j + 2 );&lt;br /&gt;
                if s == &amp;quot;//&amp;quot; then&lt;br /&gt;
                    s = &amp;quot; &amp;quot; .. area:sub( 1,  j + 2 );&lt;br /&gt;
                    s = s:match( &amp;quot;%s(%a+://)$&amp;quot; );&lt;br /&gt;
                    if s  and  TemplUtl.feasible( s ) then&lt;br /&gt;
                        s = area .. &amp;quot; &amp;quot;;&lt;br /&gt;
                        s = s:match( &amp;quot;([^%s|]+)%s&amp;quot;, j );&lt;br /&gt;
                        if s then&lt;br /&gt;
                            k = s:find( &amp;quot;}}&amp;quot; );&lt;br /&gt;
                            if k then&lt;br /&gt;
                                j = j + k + 1;&lt;br /&gt;
                            else&lt;br /&gt;
                                j = j + s:len();&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            j = j + 1;&lt;br /&gt;
        else&lt;br /&gt;
            loop = false;&lt;br /&gt;
        end&lt;br /&gt;
    end -- while loop&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = area:len();&lt;br /&gt;
    end&lt;br /&gt;
    return r, loop;&lt;br /&gt;
end -- TemplUtl.feed()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.feeder = function ( area, at )&lt;br /&gt;
    -- Retrieve all parameters&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area   -- string; template transclusion&lt;br /&gt;
    --     at     -- optional number; byte position in area of &amp;quot;{{&amp;quot;&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns&lt;br /&gt;
    --          -- table&lt;br /&gt;
    --              [0]       -- template, page, parser function name&lt;br /&gt;
    --              [1]       -- unnamed parameter&lt;br /&gt;
    --              [&amp;quot;name&amp;quot;]  -- named parameter&lt;br /&gt;
    --          -- string; error message, if any, else nil&lt;br /&gt;
    local n = 0;&lt;br /&gt;
    local j, k, p, r, r2, s, v;&lt;br /&gt;
    if type( at ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        j = at + 2;&lt;br /&gt;
    else&lt;br /&gt;
        j = 3;&lt;br /&gt;
    end&lt;br /&gt;
    while true do&lt;br /&gt;
        k = TemplUtl.feed( area, false, j );&lt;br /&gt;
        s = area:sub( j, k );&lt;br /&gt;
        s = s:gsub( &amp;quot;&amp;lt;!--.*--&amp;gt;&amp;quot;, &amp;quot;&amp;quot; );&lt;br /&gt;
        if n == 0 then&lt;br /&gt;
            r = { [ 0 ] = s };&lt;br /&gt;
            n = 1;&lt;br /&gt;
        else&lt;br /&gt;
            p, v = s:match( &amp;quot;^([^=]*)=(.*)$&amp;quot; );&lt;br /&gt;
            if p then&lt;br /&gt;
                if p:match( &amp;quot;^%s*%d+%s*$&amp;quot; )  then&lt;br /&gt;
                    p = tonumber( p );&lt;br /&gt;
                else&lt;br /&gt;
                    p = mw.text.trim( p );&lt;br /&gt;
                end&lt;br /&gt;
                v = mw.text.trim( v );&lt;br /&gt;
            else&lt;br /&gt;
                p = n;&lt;br /&gt;
                v = s;&lt;br /&gt;
                n = n + 1;&lt;br /&gt;
            end&lt;br /&gt;
            if r[ p ] then&lt;br /&gt;
                if r2 then&lt;br /&gt;
                    r2 = r2 .. &amp;quot; * &amp;quot;;&lt;br /&gt;
                else&lt;br /&gt;
                    r2 = &amp;quot;&amp;quot;;&lt;br /&gt;
                end&lt;br /&gt;
                r2 = string.format( &amp;quot;%s%s '%s'&amp;quot;,&lt;br /&gt;
                                    r2,&lt;br /&gt;
                                    &amp;quot;duplicated parameter&amp;quot;,&lt;br /&gt;
                                    tostring( p ) );&lt;br /&gt;
            end&lt;br /&gt;
            r[ p ] = v;&lt;br /&gt;
        end&lt;br /&gt;
        s = area:sub( k + 1,  k + 2 );&lt;br /&gt;
        if s == &amp;quot;}}&amp;quot; then&lt;br /&gt;
            break;    -- while true&lt;br /&gt;
        elseif s == &amp;quot;&amp;quot; then&lt;br /&gt;
            r2 = &amp;quot;template not closed&amp;quot;;&lt;br /&gt;
            break;    -- while true&lt;br /&gt;
        end&lt;br /&gt;
        j = k + 2;&lt;br /&gt;
    end -- while true&lt;br /&gt;
    return r, r2;&lt;br /&gt;
end -- TemplUtl.feeder()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.fetch = function ( area, ask )&lt;br /&gt;
    -- Find assignment of a named template parameter&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area  -- string; template transclusion&lt;br /&gt;
    --     ask   -- string; parameter name&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string with trimmed parameter value, or nil&lt;br /&gt;
    --     Does not return value if template inside&lt;br /&gt;
    local r;&lt;br /&gt;
    local scan = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                                &amp;quot;|%s*&amp;quot;, ask, &amp;quot;%s*=(.+)$&amp;quot; );&lt;br /&gt;
    r = mw.ustring.match( area, scan );&lt;br /&gt;
    if r then&lt;br /&gt;
        local j = TemplUtl.feed( r, false, 1 );&lt;br /&gt;
        r = r:sub( 1, j );&lt;br /&gt;
        if r then&lt;br /&gt;
            r = mw.text.trim( r );&lt;br /&gt;
            if r == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = nil;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r;&lt;br /&gt;
end -- TemplUtl.fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.find = function ( area, access, at, alter )&lt;br /&gt;
    -- Find next occurrence of a template&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area    -- string; where to search&lt;br /&gt;
    --     access  -- string; trimmed (template) title&lt;br /&gt;
    --     at      -- optional number; ustring position in area, if not 1&lt;br /&gt;
    --     alter   -- optional string; lowercase namespace pattern&lt;br /&gt;
    --                                 &amp;quot;&amp;quot; for article&lt;br /&gt;
    --                                 no colon (:)&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns ustring position of &amp;quot;{{&amp;quot; in area, or false&lt;br /&gt;
    -- Requires:&lt;br /&gt;
    --     fiatTitleRegExp()&lt;br /&gt;
    local scan = string.format( &amp;quot;{{%s%s%s&amp;quot;,&lt;br /&gt;
                                &amp;quot;([%w_%s:]*)%s*&amp;quot;,&lt;br /&gt;
                                fiatTitleRegExp( access ),&lt;br /&gt;
                                &amp;quot;%s*([|}&amp;lt;]!?)&amp;quot; );&lt;br /&gt;
    local r, space, start, suffix;&lt;br /&gt;
    if type( at ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        r = at;&lt;br /&gt;
    else&lt;br /&gt;
        r = 1;&lt;br /&gt;
    end&lt;br /&gt;
    while true do&lt;br /&gt;
        r = mw.ustring.find( area, scan, r );&lt;br /&gt;
        if r then&lt;br /&gt;
            start, suffix = mw.ustring.match( area, scan, r );&lt;br /&gt;
            if start then&lt;br /&gt;
                start = mw.text.trim( start );&lt;br /&gt;
                if start == &amp;quot;&amp;quot; then&lt;br /&gt;
                    break; -- while true&lt;br /&gt;
                elseif alter then&lt;br /&gt;
                    if not space then&lt;br /&gt;
                        space = string.format( &amp;quot;^:?%s:$&amp;quot;, alter );&lt;br /&gt;
                    end&lt;br /&gt;
                    start = mw.ustring.lower( start );&lt;br /&gt;
                    if mw.ustring.match( start, space ) then&lt;br /&gt;
                        break; -- while true&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    start = start:match( &amp;quot;^:?(.+):$&amp;quot; );&lt;br /&gt;
                    if start then&lt;br /&gt;
                        start = mw.ustring.lower( start );&lt;br /&gt;
                        if start == &amp;quot;template&amp;quot; then&lt;br /&gt;
                            break; -- while true&lt;br /&gt;
                        else&lt;br /&gt;
                            if not space then&lt;br /&gt;
                                space = mw.site.namespaces[ 10 ].name;&lt;br /&gt;
                                space = mw.ustring.lower( space );&lt;br /&gt;
                            end&lt;br /&gt;
                            start = start:gsub( &amp;quot;_&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                                         :gsub( &amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot; );&lt;br /&gt;
                            if start == space then&lt;br /&gt;
                                break; -- while true&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                break; -- while true&lt;br /&gt;
            end&lt;br /&gt;
            r = r + 2;&lt;br /&gt;
        else&lt;br /&gt;
            r = false;&lt;br /&gt;
            break; -- while true&lt;br /&gt;
        end&lt;br /&gt;
    end -- while true&lt;br /&gt;
    return r;&lt;br /&gt;
end -- TemplUtl.find()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- finder()&lt;br /&gt;
--      1 page name&lt;br /&gt;
--      2 template title / page name&lt;br /&gt;
--      3 4 5 6&lt;br /&gt;
--        more like 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.firstbreak = function ( adjust )&lt;br /&gt;
    -- Precede leading character with newline if specific syntax&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    adjust  -- string; trimmed wikitext&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string, modified if necessary&lt;br /&gt;
    return fallible( adjust, true );&lt;br /&gt;
end -- TemplUtl.firstbreak()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.flat = function ( area )&lt;br /&gt;
    -- Remove syntax elements that hide effective syntax only&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     area  -- string; unparsed wikitext to be reduced&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns cleared wikitext&lt;br /&gt;
    local delimiters = { { &amp;quot;&amp;lt;%s*NOWIKI%s*&amp;gt;&amp;quot;, &amp;quot;&amp;lt;%s*/%s*NOWIKI%s*&amp;gt;&amp;quot; },&lt;br /&gt;
                         { &amp;quot;&amp;lt;!--&amp;quot;, &amp;quot;--&amp;gt;&amp;quot;, true },&lt;br /&gt;
                         { &amp;quot;&amp;lt;%s*PRE%s*&amp;gt;&amp;quot;, &amp;quot;&amp;lt;%s*/%s*PRE%s*&amp;gt;&amp;quot; },&lt;br /&gt;
                         { &amp;quot;&amp;lt;%s*SYNTAXHIGHLIGHT[^&amp;lt;&amp;gt;]*&amp;gt;&amp;quot;,&lt;br /&gt;
                           &amp;quot;&amp;lt;%s*/%s*SYNTAXHIGHLIGHT%s*&amp;gt;&amp;quot; } };&lt;br /&gt;
    local i          = 1;&lt;br /&gt;
    local r          = area;&lt;br /&gt;
    local k, m, n;&lt;br /&gt;
    if not TemplUtl.Delimiters then&lt;br /&gt;
        local c, sD, sP;&lt;br /&gt;
        TemplUtl.Delimiters = { };&lt;br /&gt;
        for j = 1, #delimiters do&lt;br /&gt;
            table.insert( TemplUtl.Delimiters, { } );&lt;br /&gt;
            for ji = 1, 2 do&lt;br /&gt;
                sD = delimiters[ j ][ ji ];&lt;br /&gt;
                sP = &amp;quot;&amp;quot;;&lt;br /&gt;
                for js = 1, #sD, 1 do&lt;br /&gt;
                    c = sD:byte( js, js );&lt;br /&gt;
                    if c &amp;gt;= 65  and  c &amp;lt;= 90 then&lt;br /&gt;
                        sP = string.format( &amp;quot;%s[%c%c]&amp;quot;,&lt;br /&gt;
                                            sP,  c,  c + 32 );&lt;br /&gt;
                    else&lt;br /&gt;
                        sP = sP .. string.char( c );&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for js&lt;br /&gt;
                table.insert( TemplUtl.Delimiters[ j ], sP );&lt;br /&gt;
            end -- for ji&lt;br /&gt;
        end -- for j&lt;br /&gt;
    end&lt;br /&gt;
    while ( true ) do&lt;br /&gt;
        k = false;&lt;br /&gt;
        for j = 1, #delimiters do&lt;br /&gt;
            m = r:find( TemplUtl.Delimiters[ j ][ 1 ],&lt;br /&gt;
                        i,&lt;br /&gt;
                        TemplUtl.Delimiters[ j ][ 3 ] );&lt;br /&gt;
            if m  and  ( not k  or  m &amp;lt; k ) then&lt;br /&gt;
                k = m;&lt;br /&gt;
                n = j;&lt;br /&gt;
            end&lt;br /&gt;
        end -- for j&lt;br /&gt;
        if k then&lt;br /&gt;
            local s&lt;br /&gt;
            if k &amp;gt; 1 then&lt;br /&gt;
                i = k - 1;&lt;br /&gt;
                s = r:sub( 1, i );&lt;br /&gt;
            else&lt;br /&gt;
                s = &amp;quot;&amp;quot;;&lt;br /&gt;
            end&lt;br /&gt;
            j, m  =  r:find( TemplUtl.Delimiters[ n ][ 2 ],&lt;br /&gt;
                             k + 1,&lt;br /&gt;
                             TemplUtl.Delimiters[ n ][ 3 ] );&lt;br /&gt;
            if m then&lt;br /&gt;
                r = s  ..  r:sub( m + 1 );&lt;br /&gt;
            else&lt;br /&gt;
                r = s;&lt;br /&gt;
                break; -- while true&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            break; -- while true&lt;br /&gt;
        end&lt;br /&gt;
    end -- while true&lt;br /&gt;
    return r;&lt;br /&gt;
end -- TemplUtl.flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TemplUtl.nowiki1 = function ( adjust )&lt;br /&gt;
    -- HTML-escape leading character if disturbing syntax&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --    adjust  -- string; trimmed wikitext&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --    Returns string, modified if necessary&lt;br /&gt;
    return fallible( adjust, false );&lt;br /&gt;
end -- TemplUtl.nowiki1()&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&lt;br /&gt;
    --                         or wikidata|item|~|@ or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-17&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local last    = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked  = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link    = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  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 suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if link then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&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;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&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;
    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;
function p.faculty( frame )&lt;br /&gt;
    return TemplUtl.faculty( frame.args[ 1 ],&lt;br /&gt;
                             frame.args[ 2 ] )  and  &amp;quot;1&amp;quot;&lt;br /&gt;
           or   &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.faculty&lt;br /&gt;
&lt;br /&gt;
function p.failure( frame )&lt;br /&gt;
    local scream = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; );&lt;br /&gt;
    local loud   = frame.args[ 2 ];&lt;br /&gt;
    local select = frame.args.class;&lt;br /&gt;
    if scream == &amp;quot;&amp;quot; then&lt;br /&gt;
        scream = &amp;quot;?????????&amp;quot;;&lt;br /&gt;
    end&lt;br /&gt;
    if loud then&lt;br /&gt;
        loud = TemplUtl.faculty( loud, nil );&lt;br /&gt;
    end&lt;br /&gt;
    return TemplUtl.failure( scream, loud, select, frame );&lt;br /&gt;
end -- p.failure&lt;br /&gt;
&lt;br /&gt;
function p.fake( frame )&lt;br /&gt;
    TemplUtl.fake( frame.args[ 1 ]  or  &amp;quot;&amp;quot;,  frame );&lt;br /&gt;
    return &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.fake&lt;br /&gt;
&lt;br /&gt;
function p.fakes( frame )&lt;br /&gt;
    local list = ( frame.args.list == &amp;quot;1&amp;quot; );&lt;br /&gt;
    local r    = TemplUtl.fakes( frame.args,&lt;br /&gt;
                                 frame,&lt;br /&gt;
                                 frame.args.prefix,&lt;br /&gt;
                                 list );&lt;br /&gt;
    return r or &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.fakes&lt;br /&gt;
&lt;br /&gt;
function p.firstbreak( frame )&lt;br /&gt;
    local r = ( frame.args[ 1 ] );&lt;br /&gt;
    if r then&lt;br /&gt;
        r = mw.text.trim( r );&lt;br /&gt;
        if r ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r = TemplUtl.firstbreak( r );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.firstbreak&lt;br /&gt;
&lt;br /&gt;
function p.from( frame )&lt;br /&gt;
    local r = frame:getParent():getTitle();&lt;br /&gt;
    if r then&lt;br /&gt;
        r = string.format( &amp;quot;&amp;amp;#123;&amp;amp;#123;%s&amp;amp;#125;&amp;amp;#125;&amp;quot;, r );&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.from&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;
function p.nowiki1( frame )&lt;br /&gt;
    local r = ( frame.args[ 1 ] );&lt;br /&gt;
    if r then&lt;br /&gt;
        r = mw.text.trim( r );&lt;br /&gt;
        if r ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r = TemplUtl.nowiki1( r );&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;;&lt;br /&gt;
end -- p.nowiki1&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.TemplUtl = function ()&lt;br /&gt;
    return TemplUtl;&lt;br /&gt;
end -- p.TemplUtl()&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Str&amp;diff=390</id>
		<title>Modul:Str</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Str&amp;diff=390"/>
		<updated>2022-02-23T14:42:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function escape_lua_regex(str)&lt;br /&gt;
	return mw.ustring.gsub(str, &amp;quot;.&amp;quot;, {&lt;br /&gt;
	    [&amp;quot;%&amp;quot;] = &amp;quot;%%&amp;quot;;&lt;br /&gt;
	    [&amp;quot;^&amp;quot;] = &amp;quot;%^&amp;quot;;&lt;br /&gt;
	    [&amp;quot;$&amp;quot;] = &amp;quot;%$&amp;quot;;&lt;br /&gt;
	    [&amp;quot;.&amp;quot;] = &amp;quot;%.&amp;quot;;&lt;br /&gt;
	    [&amp;quot;(&amp;quot;] = &amp;quot;%(&amp;quot;;&lt;br /&gt;
	    [&amp;quot;)&amp;quot;] = &amp;quot;%)&amp;quot;;&lt;br /&gt;
	    [&amp;quot;[&amp;quot;] = &amp;quot;%[&amp;quot;;&lt;br /&gt;
	    [&amp;quot;]&amp;quot;] = &amp;quot;%]&amp;quot;;&lt;br /&gt;
	    [&amp;quot;?&amp;quot;] = &amp;quot;%?&amp;quot;;&lt;br /&gt;
	    [&amp;quot;*&amp;quot;] = &amp;quot;%*&amp;quot;;&lt;br /&gt;
	    [&amp;quot;+&amp;quot;] = &amp;quot;%+&amp;quot;;&lt;br /&gt;
	    [&amp;quot;-&amp;quot;] = &amp;quot;%-&amp;quot;;&lt;br /&gt;
	    [&amp;quot;\0&amp;quot;] = &amp;quot;%z&amp;quot;;&lt;br /&gt;
  	})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function trim(s)&lt;br /&gt;
	s = mw.ustring.gsub(s,&amp;quot;\n&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	while mw.ustring.sub(s,1,1) == &amp;quot; &amp;quot; do&lt;br /&gt;
		s=  mw.ustring.sub(s,2,-1);&lt;br /&gt;
	end&lt;br /&gt;
	while mw.ustring.sub(s,-1,-1) == &amp;quot; &amp;quot; do&lt;br /&gt;
		s=  mw.ustring.sub(s,1,-2);&lt;br /&gt;
	end&lt;br /&gt;
	return s;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local Str = {} &lt;br /&gt;
	function Str.len(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		return mw.ustring.len(s);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.left(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local idx = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		if idx &amp;lt; 1 then&lt;br /&gt;
			return &amp;quot;&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,1,idx);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.right(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local length = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		if length &amp;lt; 1 then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			length = -length;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,length,-1)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.index(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local idx = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		if idx &amp;lt; 1 then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,idx,idx)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.sub(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local von = tonumber(frame.args[2]) or 1;&lt;br /&gt;
		local length = tonumber(frame.args[3]) or 0;&lt;br /&gt;
		if (von &amp;lt; 1) then&lt;br /&gt;
			von = 1&lt;br /&gt;
		end&lt;br /&gt;
		local bis = von + length - 1&lt;br /&gt;
		if (bis &amp;lt; von) then&lt;br /&gt;
			return &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,von,bis)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.crop(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local cut = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		local length =  mw.ustring.len(s)&lt;br /&gt;
		if cut &amp;lt; 1 then&lt;br /&gt;
			return s;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,1,length - cut)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function Str.cropleft(frame)&lt;br /&gt;
		local s = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local cut = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		local length =  mw.ustring.len(s)&lt;br /&gt;
		if cut &amp;lt; 1 then&lt;br /&gt;
			return s;&lt;br /&gt;
		end&lt;br /&gt;
		return mw.ustring.sub(s,cut+1,-1);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.find(frame)&lt;br /&gt;
		local text = trim((frame.args[1] or &amp;quot;&amp;quot;));&lt;br /&gt;
		local pat = frame.args[2] or &amp;quot;&amp;quot;;&lt;br /&gt;
		if pat == &amp;quot;&amp;quot; then&lt;br /&gt;
			return 1&lt;br /&gt;
		end&lt;br /&gt;
		local idx = mw.ustring.find(text,pat,1,true)&lt;br /&gt;
		if idx then&lt;br /&gt;
			return idx;&lt;br /&gt;
		else&lt;br /&gt;
			return -1;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.hex2dez(frame)&lt;br /&gt;
		a = tonumber(frame.args[1],16) or 0;&lt;br /&gt;
		return a&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.match(frame)&lt;br /&gt;
		local text = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
		local pattern = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
		local index = tonumber(frame.args[3]) or 0&lt;br /&gt;
		if (text == &amp;quot;&amp;quot; or pattern == &amp;quot;&amp;quot;) then return &amp;quot;&amp;quot; end&lt;br /&gt;
		-- return all captures (denoted by brackets in the pattern) if index is zero, otherwise return only the index-th capture&lt;br /&gt;
		if index &amp;lt;= 0 then&lt;br /&gt;
			return mw.ustring.match(text, pattern)&lt;br /&gt;
		else&lt;br /&gt;
			return ({mw.ustring.match(text, pattern)})[index]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.rep(frame)&lt;br /&gt;
		local repetitions = tonumber(frame.args[2]) or 0;&lt;br /&gt;
		return mw.ustring.rep( frame.args[1] or '', repetitions );&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function Str.replace(frame)	&lt;br /&gt;
		local text = frame.args[1] or &amp;quot;&amp;quot;;      -- Text, der bearbeitet werden soll&lt;br /&gt;
		local search = frame.args[2] or &amp;quot;&amp;quot;;    -- Textstellen innerhalb von &amp;quot;text&amp;quot; die ersetzt werden sollen&lt;br /&gt;
		local replace = frame.args[3] or &amp;quot;&amp;quot;;   -- Ersetzungstext&lt;br /&gt;
		if text == &amp;quot;&amp;quot; or search == &amp;quot;&amp;quot; then&lt;br /&gt;
			return &amp;quot;&amp;quot;;&lt;br /&gt;
		end &lt;br /&gt;
		local count = tonumber(frame.args[4]) -- Anzahl der Ersetzungen (optional)&lt;br /&gt;
		local regexsearch = frame.args[5]     -- beliebiger Wert um dafür zu sorgen, dass der Suchtext &amp;quot;search&amp;quot; als Lua-regulärer Ausdruck behandelt werden soll&lt;br /&gt;
		if not regexsearch or regexsearch == &amp;quot;&amp;quot; then&lt;br /&gt;
			search = escape_lua_regex(search)&lt;br /&gt;
			replace = mw.ustring.gsub(replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		local result&lt;br /&gt;
		if count then&lt;br /&gt;
			result,_ = mw.ustring.gsub(text, search, replace, count)&lt;br /&gt;
		else&lt;br /&gt;
			result,_ = mw.ustring.gsub(text, search, replace)&lt;br /&gt;
		end&lt;br /&gt;
		return result&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- richtet Zahlen numerisch aus&lt;br /&gt;
	function Str.adjustnumber(frame)&lt;br /&gt;
		local ausgabe;&lt;br /&gt;
		local text  = frame.args[1] or &amp;quot;&amp;quot;      -- Text, der bearbeitet werden soll, i.d.R. eine Dezimalzahl&lt;br /&gt;
		local i_li = math.floor(tonumber(frame.args[2])) or 2;     -- maximale Stellen links vom Trennzeichen&lt;br /&gt;
		local i_re = math.floor(tonumber(frame.args[3])) or 2;    -- maximale Stellen rechts vom Trennzeichen&lt;br /&gt;
		local sign  = frame.args['Z'] or &amp;quot;,&amp;quot;   -- Trennzeichen&lt;br /&gt;
		local zeroes='00000000000000000000';   -- 20 duerften ausreichen.&lt;br /&gt;
		local zpos = 0;&lt;br /&gt;
		local len =  mw.ustring.len(text);&lt;br /&gt;
		if not text  or sign == &amp;quot;&amp;quot; then&lt;br /&gt;
			zpos = len + 1;&lt;br /&gt;
		else&lt;br /&gt;
			zpos = mw.ustring.find(text, sign,1, true) or len;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local zl = 0;&lt;br /&gt;
		local zr = 0;&lt;br /&gt;
		local t_li = &amp;quot;&amp;quot;;&lt;br /&gt;
		local t_re = &amp;quot;&amp;quot;;&lt;br /&gt;
		local z_li =&amp;quot;&amp;quot;;&lt;br /&gt;
		local z_re =&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
		if zpos &amp;gt; 1 then &lt;br /&gt;
			t_li = mw.ustring.sub(text,1, zpos-1);&lt;br /&gt;
		else&lt;br /&gt;
			t_li=&amp;quot;&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if len-zpos &amp;gt; 0 then &lt;br /&gt;
			t_re = mw.ustring.sub(text,zpos+1,-1);&lt;br /&gt;
		else&lt;br /&gt;
			t_re=&amp;quot;&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		zl = i_li -  mw.ustring.len(t_li);&lt;br /&gt;
		if zl &amp;lt; 1 then&lt;br /&gt;
			zl = 0;&lt;br /&gt;
			z_li = &amp;quot;&amp;quot;;&lt;br /&gt;
		else&lt;br /&gt;
			z_li = '&amp;lt;span style=&amp;quot;visibility:hidden;&amp;quot;&amp;gt;' .. mw.ustring.sub(zeroes,1,zl) .. '&amp;lt;/span&amp;gt;';&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		zr = i_re -  mw.ustring.len(t_re);&lt;br /&gt;
		if zr &amp;lt; 1 then&lt;br /&gt;
			zr = 0;&lt;br /&gt;
			z_re =&amp;quot;&amp;quot;;&lt;br /&gt;
		else&lt;br /&gt;
			z_re ='&amp;lt;span style=&amp;quot;visibility:hidden;&amp;quot;&amp;gt;' ..  mw.ustring.sub(zeroes,1,zr) .. '&amp;lt;/span&amp;gt;';&lt;br /&gt;
		end&lt;br /&gt;
		ausgabe = z_li .. t_li  .. sign .. t_re .. z_re;&lt;br /&gt;
		return ausgabe;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
-- Konvertierung von Mathe-Minus, Geviert-, Halbgeviert- und Viertelgeviertstrich, sowie U+2012 ins ASCII-Minus.&lt;br /&gt;
function Str.minus(frame)&lt;br /&gt;
	local s = frame.args[1] or &amp;quot;&amp;quot;;&lt;br /&gt;
	s = mw.ustring.gsub(s,'−','-'); -- Erstes Zeichen ist U+2212 (Mathe-Minus)&lt;br /&gt;
	s = mw.ustring.gsub(s,'‐','-'); -- Erstes Zeichen ist U+2010 (Viertelgeviertstrich)!&lt;br /&gt;
	s = mw.ustring.gsub(s,'‒','-'); -- Erstes Zeichen ist U+2012 (Figure dash)!&lt;br /&gt;
	s = mw.ustring.gsub(s,'–','-'); -- Erstes Zeichen ist U+2013 (Halbgeviertstrich)!&lt;br /&gt;
	s = mw.ustring.gsub(s,'—','-'); -- Erstes Zeichen ist U+2014 (Geviertstrich)!&lt;br /&gt;
	return s;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Die folgende Stringfunktion rundet Zahlen und gibt im Unterschied zu &lt;br /&gt;
-- &amp;quot;round&amp;quot; im Modul FormatNum auch nachfolgende Nullen aus.&lt;br /&gt;
--  So wird &amp;quot;1.12&amp;quot; bei drei Nachkommastellen als &amp;quot;1.120&amp;quot; zurückgegeben.&lt;br /&gt;
function Str.round(frame)&lt;br /&gt;
	local num  = tonumber(frame.args[1] or '') or 'NaN'; -- zu rundende Zahl&lt;br /&gt;
	local prec = tonumber(frame.args[2] or '') or 'NaN'; -- Dezimalstellen&lt;br /&gt;
	if num == 'NaN' or prec =='NaN' then&lt;br /&gt;
		return &amp;quot;NaN&amp;quot;;&lt;br /&gt;
	end&lt;br /&gt;
	prec = math.floor(prec);  &lt;br /&gt;
	local out = &amp;quot;&amp;quot;;&lt;br /&gt;
	local rnd = 10;&lt;br /&gt;
	if prec &amp;gt; 0 then&lt;br /&gt;
		local fmt = &amp;quot;%.&amp;quot; .. tostring(prec) .. &amp;quot;f&amp;quot;;&lt;br /&gt;
		out = string.format(fmt,num); -- Zahlen haben nur ASCII-Zeichen&lt;br /&gt;
	else&lt;br /&gt;
		rnd = 10^(-prec);&lt;br /&gt;
		num = math.floor(num/rnd + 0.5) * rnd;&lt;br /&gt;
		out = string.format(&amp;quot;%d&amp;quot;,num); -- Zahlen haben nur ASCII-Zeichen&lt;br /&gt;
	end&lt;br /&gt;
	return out;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Str&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:PageUtil&amp;diff=388</id>
		<title>Modul:PageUtil</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:PageUtil&amp;diff=388"/>
		<updated>2022-02-23T14:42:26Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&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 '%s'&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;'''Too many pages (max. %d)'''&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>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Multilingual&amp;diff=386</id>
		<title>Modul:Multilingual</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:Multilingual&amp;diff=386"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Multilingual = { suite   = &amp;quot;Multilingual&amp;quot;,&lt;br /&gt;
                       serial  = &amp;quot;2020-12-10&amp;quot;,&lt;br /&gt;
                       item    = 47541920,&lt;br /&gt;
                       globals = { ISO15924 = 71584769,&lt;br /&gt;
                                   WLink    = 19363224 }&lt;br /&gt;
                     }&lt;br /&gt;
--[=[&lt;br /&gt;
Utilities for multilingual texts and ISO 639 (BCP47) issues etc.&lt;br /&gt;
* fair()&lt;br /&gt;
* fallback()&lt;br /&gt;
* findCode()&lt;br /&gt;
* fix()&lt;br /&gt;
* format()&lt;br /&gt;
* getBase()&lt;br /&gt;
* getLang()&lt;br /&gt;
* getName()&lt;br /&gt;
* i18n()&lt;br /&gt;
* int()&lt;br /&gt;
* isLang()&lt;br /&gt;
* isLangWiki()&lt;br /&gt;
* isMinusculable()&lt;br /&gt;
* isRTL()&lt;br /&gt;
* message()&lt;br /&gt;
* sitelink()&lt;br /&gt;
* tabData()&lt;br /&gt;
* userLang()&lt;br /&gt;
* userLangCode()&lt;br /&gt;
* wikibase()&lt;br /&gt;
* failsafe()&lt;br /&gt;
loadData: Multilingual/config Multilingual/names&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe   = Multilingual&lt;br /&gt;
local GlobalMod  = Multilingual&lt;br /&gt;
local GlobalData = Multilingual&lt;br /&gt;
local User       = { sniffer = &amp;quot;showpreview&amp;quot; }&lt;br /&gt;
Multilingual.globals.Multilingual = Multilingual.item&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.exotic = { simple = true,&lt;br /&gt;
                        no     = true }&lt;br /&gt;
Multilingual.prefer = { cs = true,&lt;br /&gt;
                        de = true,&lt;br /&gt;
                        en = true,&lt;br /&gt;
                        es = true,&lt;br /&gt;
                        fr = true,&lt;br /&gt;
                        it = true,&lt;br /&gt;
                        nl = true,&lt;br /&gt;
                        pt = true,&lt;br /&gt;
                        ru = true,&lt;br /&gt;
                        sv = true }&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 fetchData = function ( access )&lt;br /&gt;
    -- Retrieve translated keyword from commons:Data:****.tab&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- string, with page identification on Commons&lt;br /&gt;
    --     Returns table, with data, or string, with error message&lt;br /&gt;
    -- 2019-12-05&lt;br /&gt;
    local storage = access&lt;br /&gt;
    local r&lt;br /&gt;
    if type( storage ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local s&lt;br /&gt;
        storage = mw.text.trim( storage )&lt;br /&gt;
        s = storage:lower()&lt;br /&gt;
        if s:sub( 1, 2 ) == &amp;quot;c:&amp;quot; then&lt;br /&gt;
            storage = mw.text.trim( storage:sub( 3 ) )&lt;br /&gt;
            s       = storage:lower()&lt;br /&gt;
        elseif s:sub( 1, 8 ) == &amp;quot;commons:&amp;quot; then&lt;br /&gt;
            storage = mw.text.trim( storage:sub( 9 ) )&lt;br /&gt;
            s       = storage:lower()&lt;br /&gt;
        end&lt;br /&gt;
        if s:sub( 1, 5 ) == &amp;quot;data:&amp;quot; then&lt;br /&gt;
            storage = mw.text.trim( storage:sub( 6 ) )&lt;br /&gt;
            s       = storage:lower()&lt;br /&gt;
        end&lt;br /&gt;
        if s == &amp;quot;&amp;quot;  or  s == &amp;quot;.tab&amp;quot; then&lt;br /&gt;
            storage = false&lt;br /&gt;
        elseif s:sub( -4 ) == &amp;quot;.tab&amp;quot; then&lt;br /&gt;
            storage = storage:sub( 1, -5 ) .. &amp;quot;.tab&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            storage = storage .. &amp;quot;.tab&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( storage ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local data&lt;br /&gt;
        if type( GlobalData.TabDATA ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            GlobalData.TabDATA = { }&lt;br /&gt;
        end&lt;br /&gt;
        data = GlobalData.TabDATA[ storage ]&lt;br /&gt;
        if data then&lt;br /&gt;
            r = data&lt;br /&gt;
        else&lt;br /&gt;
            local lucky&lt;br /&gt;
            lucky, data = pcall( mw.ext.data.get, storage, &amp;quot;_&amp;quot; )&lt;br /&gt;
            if type( data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                data = data.data&lt;br /&gt;
                if type( data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    GlobalData.TabDATA[ storage ] = data&lt;br /&gt;
                else&lt;br /&gt;
                    r = string.format( &amp;quot;%s [[%s%s]]&amp;quot;,&lt;br /&gt;
                                       &amp;quot;INVALID Data:*.tab&amp;quot;,&lt;br /&gt;
                                       &amp;quot;commons:Data:&amp;quot;,&lt;br /&gt;
                                       storage )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;BAD PAGE Data:*.tab &amp;amp;#8211; commons:&amp;quot; .. storage&lt;br /&gt;
            end&lt;br /&gt;
            if r then&lt;br /&gt;
                GlobalData.TabDATA[ storage ] = r&lt;br /&gt;
                data = false&lt;br /&gt;
            else&lt;br /&gt;
                r = data&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;BAD PAGE commons:Data:*.tab&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fetchData()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local favorites = function ()&lt;br /&gt;
    -- Provide fallback codes&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns table with sequence of preferred languages&lt;br /&gt;
    --     * ahead elements&lt;br /&gt;
    --     * user (not yet accessible)&lt;br /&gt;
    --     * page content language (not yet accessible)&lt;br /&gt;
    --     * page name subpage&lt;br /&gt;
    --     * project&lt;br /&gt;
    --     * en&lt;br /&gt;
    local r = Multilingual.polyglott&lt;br /&gt;
    if not r then&lt;br /&gt;
        local self = mw.language.getContentLanguage():getCode():lower()&lt;br /&gt;
        local sub  = mw.title.getCurrentTitle().subpageText&lt;br /&gt;
        local f    = function ( add )&lt;br /&gt;
                         local s = add&lt;br /&gt;
                         for i = 1, #r do&lt;br /&gt;
                             if r[ i ] == s then&lt;br /&gt;
                                 s = false&lt;br /&gt;
                                 break -- for i&lt;br /&gt;
                             end&lt;br /&gt;
                         end -- for i&lt;br /&gt;
                         if s then&lt;br /&gt;
                             table.insert( r, s )&lt;br /&gt;
                         end&lt;br /&gt;
                     end&lt;br /&gt;
        r = { }&lt;br /&gt;
        if sub:find( &amp;quot;/&amp;quot;, 2, true ) then&lt;br /&gt;
            sub = sub:match( &amp;quot;/(%l%l%l?)$&amp;quot; )&lt;br /&gt;
            if sub then&lt;br /&gt;
                table.insert( r, sub )&lt;br /&gt;
            end&lt;br /&gt;
        elseif sub:find( &amp;quot;^%l%l%l?%-?%a?%a?%a?%a?$&amp;quot; )  and&lt;br /&gt;
               mw.language.isSupportedLanguage( sub ) then&lt;br /&gt;
            table.insert( r, sub )&lt;br /&gt;
        end&lt;br /&gt;
        f( self )&lt;br /&gt;
        f( &amp;quot;en&amp;quot; )&lt;br /&gt;
        Multilingual.polyglott = r&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- favorites()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local feasible = function ( ask, accept )&lt;br /&gt;
    -- Is ask to be supported by application?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask     -- lowercase code&lt;br /&gt;
    --     accept  -- sequence table, with offered lowercase codes&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     nil, or true&lt;br /&gt;
    local r&lt;br /&gt;
    for i = 1, #accept do&lt;br /&gt;
        if accept[ i ] == ask then&lt;br /&gt;
            r = true&lt;br /&gt;
            break -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end -- for i&lt;br /&gt;
    return r&lt;br /&gt;
end -- feasible()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fetch = function ( access, append )&lt;br /&gt;
    -- Attach config or library module&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- module title&lt;br /&gt;
    --     append  -- string, with subpage part of this; or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns:  table, with library, or false&lt;br /&gt;
    local got, sign&lt;br /&gt;
    if append then&lt;br /&gt;
        sign = string.format( &amp;quot;%s/%s&amp;quot;, access, append )&lt;br /&gt;
    else&lt;br /&gt;
        sign = access&lt;br /&gt;
    end&lt;br /&gt;
    if type( Multilingual.ext ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        Multilingual.ext = { }&lt;br /&gt;
    end&lt;br /&gt;
    got = Multilingual.ext[ sign ]&lt;br /&gt;
    if not got  and  got ~= false then&lt;br /&gt;
        local global = Multilingual.globals[ access ]&lt;br /&gt;
        local lib    = ( not append  or  append == &amp;quot;config&amp;quot; )&lt;br /&gt;
        got = foreignModule( access, lib, append, global )&lt;br /&gt;
        if type( got ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            if lib then&lt;br /&gt;
                local startup = got[ access ]&lt;br /&gt;
                if type( startup ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                    got = startup()&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            got = false&lt;br /&gt;
        end&lt;br /&gt;
        Multilingual.ext[ sign ] = got&lt;br /&gt;
    end&lt;br /&gt;
    return got&lt;br /&gt;
end -- fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fetchISO639 = function ( access )&lt;br /&gt;
    -- Retrieve table from commons:Data:ISO639/***.tab&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- string, with subpage identification&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns table, with data, even empty&lt;br /&gt;
    local r&lt;br /&gt;
    if type( Multilingual.iso639 ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        Multilingual.iso639 = { }&lt;br /&gt;
    end&lt;br /&gt;
    r = Multilingual.iso639[ access ]&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        local raw = fetchData( &amp;quot;ISO639/&amp;quot; .. access )&lt;br /&gt;
        if type( raw ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local t&lt;br /&gt;
            r = { }&lt;br /&gt;
            for i = 1, #raw do&lt;br /&gt;
                t = raw[ i ]&lt;br /&gt;
                if type( t ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                   type( t[ 1 ] ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
                   type( t[ 2 ] ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                    r[ t[ 1 ] ] =  t[ 2 ]&lt;br /&gt;
                else&lt;br /&gt;
                    break -- for i&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
        Multilingual.iso639[ access ] = r&lt;br /&gt;
    end&lt;br /&gt;
    return r or { }&lt;br /&gt;
end -- fetchISO639()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fill = function ( access, alien, frame )&lt;br /&gt;
    -- Expand language name template&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- string, with language code&lt;br /&gt;
    --     alien   -- language code for which to be generated&lt;br /&gt;
    --     frame   -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string&lt;br /&gt;
    local template = Multilingual.tmplLang&lt;br /&gt;
    local r&lt;br /&gt;
    if type( template ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        local cnf = fetch( &amp;quot;Multilingual&amp;quot;, &amp;quot;config&amp;quot; )&lt;br /&gt;
        if cnf then&lt;br /&gt;
            template = cnf.tmplLang&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( template ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local source = template.title&lt;br /&gt;
        local f, lucky, s&lt;br /&gt;
        Multilingual.tmplLang = template&lt;br /&gt;
        if type( source ) ~= &amp;quot;string&amp;quot;  and&lt;br /&gt;
           type( template.namePat ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
           template.namePat:find( &amp;quot;%s&amp;quot;, 1, true ) then&lt;br /&gt;
            source = string.format( template.namePat, access )&lt;br /&gt;
        end&lt;br /&gt;
        if type( source ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            if not Multilingual.frame then&lt;br /&gt;
                if frame then&lt;br /&gt;
                    Multilingual.frame = frame&lt;br /&gt;
                else&lt;br /&gt;
                    Multilingual.frame = mw.getCurrentFrame()&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            f = function ( a )&lt;br /&gt;
                    return Multilingual.frame:expandTemplate{ title = a }&lt;br /&gt;
                end&lt;br /&gt;
            lucky, s = pcall( f, source )&lt;br /&gt;
            if lucky then&lt;br /&gt;
                r = s&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fill()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local find = function ( ask, alien )&lt;br /&gt;
    -- Derive language code from name&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask    -- language name, downcased&lt;br /&gt;
    --     alien  -- language code of ask&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     nil, or string&lt;br /&gt;
    local codes = mw.language.fetchLanguageNames( alien, &amp;quot;all&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    for k, v in pairs( codes ) do&lt;br /&gt;
        if mw.ustring.lower( v ) == ask then&lt;br /&gt;
            r = k&lt;br /&gt;
            break -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = Multilingual.fair( ask )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- find()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fold = function ( frame )&lt;br /&gt;
    -- Merge template and #invoke arglist&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     frame   -- template frame&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     table, with combined arglist&lt;br /&gt;
    local r = { }&lt;br /&gt;
    local f = function ( apply )&lt;br /&gt;
                  if type( apply ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                     type( apply.args ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                      for k, v in pairs( apply.args ) do&lt;br /&gt;
                          v = mw.text.trim( v )&lt;br /&gt;
                          if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                              r[ tostring( k ) ] = v&lt;br /&gt;
                          end&lt;br /&gt;
                      end -- for k, v&lt;br /&gt;
                  end&lt;br /&gt;
              end -- f()&lt;br /&gt;
    f( frame:getParent() )&lt;br /&gt;
    f( frame )&lt;br /&gt;
    return r&lt;br /&gt;
end -- fold()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
User.favorize = function ( accept, frame )&lt;br /&gt;
    -- Guess user language&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     accept  -- sequence table, with offered ISO 639 etc. codes&lt;br /&gt;
    --     frame   -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with best code, or nil&lt;br /&gt;
    if not ( User.self or User.langs ) then&lt;br /&gt;
        if not User.trials then&lt;br /&gt;
            User.tell = mw.message.new( User.sniffer )&lt;br /&gt;
            if User.tell:exists() then&lt;br /&gt;
                User.trials = { }&lt;br /&gt;
                if not Multilingual.frame then&lt;br /&gt;
                    if frame then&lt;br /&gt;
                        Multilingual.frame = frame&lt;br /&gt;
                    else&lt;br /&gt;
                        Multilingual.frame = mw.getCurrentFrame()&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                User.sin = Multilingual.frame:callParserFunction( &amp;quot;int&amp;quot;,&lt;br /&gt;
                                                           User.sniffer )&lt;br /&gt;
            else&lt;br /&gt;
                User.langs = true&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if User.sin then&lt;br /&gt;
            local order  = { }&lt;br /&gt;
            local post   = { }&lt;br /&gt;
            local three  = { }&lt;br /&gt;
            local unfold = { }&lt;br /&gt;
            local s, sin&lt;br /&gt;
            for i = 1, #accept do&lt;br /&gt;
                s = accept[ i ]&lt;br /&gt;
                if not User.trials[ s ] then&lt;br /&gt;
                    if #s &amp;gt; 2 then&lt;br /&gt;
                        if s:find( &amp;quot;-&amp;quot;, 3, true ) then&lt;br /&gt;
                            table.insert( unfold, s )&lt;br /&gt;
                        else&lt;br /&gt;
                            table.insert( three, s )&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        if Multilingual.prefer[ s ] then&lt;br /&gt;
                            table.insert( order, s )&lt;br /&gt;
                        else&lt;br /&gt;
                            table.insert( post, s )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
            for i = 1, #post do&lt;br /&gt;
                table.insert( order, post[ i ] )&lt;br /&gt;
            end -- for i&lt;br /&gt;
            for i = 1, #three do&lt;br /&gt;
                table.insert( order, three[ i ] )&lt;br /&gt;
            end -- for i&lt;br /&gt;
            for i = 1, #unfold do&lt;br /&gt;
                table.insert( order, unfold[ i ] )&lt;br /&gt;
            end -- for i&lt;br /&gt;
            for i = 1, #order do&lt;br /&gt;
                s = order[ i ]&lt;br /&gt;
                sin = User.tell:inLanguage( s ):plain()&lt;br /&gt;
                if sin == User.sin then&lt;br /&gt;
                    User.self = s&lt;br /&gt;
                    break -- for i&lt;br /&gt;
                else&lt;br /&gt;
                    User.trials[ s ] = true&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return User.self&lt;br /&gt;
end -- User.favorize()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.fair = function ( ask )&lt;br /&gt;
    -- Format language specification according to RFC 5646 etc.&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- string or table, as created by .getLang()&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local s = type( ask )&lt;br /&gt;
    local q, r&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        q = ask&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        q = Multilingual.getLang( ask )&lt;br /&gt;
    end&lt;br /&gt;
    if q  and&lt;br /&gt;
       q.legal  and&lt;br /&gt;
       mw.language.isKnownLanguageTag( q.base ) then&lt;br /&gt;
        r = q.base&lt;br /&gt;
        if q.n &amp;gt; 1 then&lt;br /&gt;
            local order = { &amp;quot;extlang&amp;quot;,&lt;br /&gt;
                            &amp;quot;script&amp;quot;,&lt;br /&gt;
                            &amp;quot;region&amp;quot;,&lt;br /&gt;
                            &amp;quot;other&amp;quot;,&lt;br /&gt;
                            &amp;quot;extension&amp;quot; }&lt;br /&gt;
            for i = 1, #order do&lt;br /&gt;
                s = q[ order[ i ] ]&lt;br /&gt;
                if s then&lt;br /&gt;
                    r =  string.format( &amp;quot;%s-%s&amp;quot;, r, s )&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Multilingual.fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.fallback = function ( able, another )&lt;br /&gt;
    -- Is another language suitable as replacement?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     able     -- language version specifier to be supported&lt;br /&gt;
    --     another  -- language specifier of a possible replacement,&lt;br /&gt;
    --                 or not to retrieve a fallback table&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean, or table with fallback codes&lt;br /&gt;
    local r&lt;br /&gt;
    if type( able ) == &amp;quot;string&amp;quot;  and  #able &amp;gt; 0 then&lt;br /&gt;
        if type( another ) == &amp;quot;string&amp;quot;  and  #another &amp;gt; 0 then&lt;br /&gt;
            if able == another then&lt;br /&gt;
                r = true&lt;br /&gt;
            else&lt;br /&gt;
                local s = Multilingual.getBase( able )&lt;br /&gt;
                if s == another then&lt;br /&gt;
                    r = true&lt;br /&gt;
                else&lt;br /&gt;
                    local others = mw.language.getFallbacksFor( s )&lt;br /&gt;
                    r = feasible( another, others )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local s = Multilingual.getBase( able )&lt;br /&gt;
            if s then&lt;br /&gt;
                r = mw.language.getFallbacksFor( s )&lt;br /&gt;
                if r[ 1 ] == &amp;quot;en&amp;quot; then&lt;br /&gt;
                    local d = fetchISO639( &amp;quot;fallback&amp;quot; )&lt;br /&gt;
                    if type( d ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                       type( d[ s ] ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                        r = mw.text.split( d[ s ], &amp;quot;|&amp;quot; )&lt;br /&gt;
                        table.insert( r, &amp;quot;en&amp;quot; )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Multilingual.fallback()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.findCode = function ( ask )&lt;br /&gt;
    -- Retrieve code of local (current project or English) language name&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- string, with presumable language name&lt;br /&gt;
    --             A code itself will be identified, too.&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local seek = mw.text.trim( ask )&lt;br /&gt;
    local r = false&lt;br /&gt;
    if #seek &amp;gt; 1 then&lt;br /&gt;
        if seek:find( &amp;quot;[&amp;quot;, 1, true ) then&lt;br /&gt;
            local wlink = fetch( &amp;quot;WLink&amp;quot; )&lt;br /&gt;
            if wlink  and&lt;br /&gt;
               type( wlink.getPlain ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                seek = wlink.getPlain( seek )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        seek = mw.ustring.lower( seek )&lt;br /&gt;
        if Multilingual.isLang( seek ) then&lt;br /&gt;
            r = Multilingual.fair( seek )&lt;br /&gt;
        else&lt;br /&gt;
            local collection = favorites()&lt;br /&gt;
            for i = 1, #collection do&lt;br /&gt;
                r = find( seek, collection[ i ] )&lt;br /&gt;
                if r then&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;
    return r&lt;br /&gt;
end -- Multilingual.findCode()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.fix = function ( attempt )&lt;br /&gt;
    -- Fix frequently mistaken language code&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     attempt  -- string, with presumable language code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with correction, or false if no problem known&lt;br /&gt;
    local r = fetchISO639( &amp;quot;correction&amp;quot; )[ attempt:lower() ]&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Multilingual.fix()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.format = function ( apply, alien, alter, active, alert,&lt;br /&gt;
                                 frame, assembly, adjacent, ahead )&lt;br /&gt;
    -- Format one or more languages&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     apply     -- string with language list or item&lt;br /&gt;
    --     alien     -- language of the answer&lt;br /&gt;
    --                  -- nil, false, &amp;quot;*&amp;quot;: native&lt;br /&gt;
    --                  -- &amp;quot;!&amp;quot;: current project&lt;br /&gt;
    --                  -- &amp;quot;#&amp;quot;: code, downcased, space separated&lt;br /&gt;
    --                  -- &amp;quot;-&amp;quot;: code, mixcase, space separated&lt;br /&gt;
    --                  -- any valid code&lt;br /&gt;
    --     alter     -- capitalize, if &amp;quot;c&amp;quot;; downcase all, if &amp;quot;d&amp;quot;&lt;br /&gt;
    --                  capitalize first item only, if &amp;quot;f&amp;quot;&lt;br /&gt;
    --                  downcase every first word only, if &amp;quot;m&amp;quot;&lt;br /&gt;
    --     active    -- link items, if true&lt;br /&gt;
    --     alert     -- string with category title in case of error&lt;br /&gt;
    --     frame     -- if available&lt;br /&gt;
    --     assembly  -- string with split pattern, if list expected&lt;br /&gt;
    --     adjacent  -- string with list separator, else assembly&lt;br /&gt;
    --     ahead     -- string to prepend first element, if any&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false if apply empty&lt;br /&gt;
    local r = false&lt;br /&gt;
    if apply then&lt;br /&gt;
        local slang&lt;br /&gt;
        if assembly then&lt;br /&gt;
            local bucket = mw.text.split( apply, assembly )&lt;br /&gt;
            local shift = alter&lt;br /&gt;
            local separator&lt;br /&gt;
            if adjacent then&lt;br /&gt;
                separator = adjacent&lt;br /&gt;
            elseif alien == &amp;quot;#&amp;quot;  or  alien == &amp;quot;-&amp;quot; then&lt;br /&gt;
                separator = &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                separator = assembly&lt;br /&gt;
            end&lt;br /&gt;
            for k, v in pairs( bucket ) do&lt;br /&gt;
                slang = Multilingual.format( v, alien, shift, active,&lt;br /&gt;
                                             alert )&lt;br /&gt;
                if slang then&lt;br /&gt;
                    if r then&lt;br /&gt;
                        r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                                           r, separator, slang )&lt;br /&gt;
                    else&lt;br /&gt;
                        r = slang&lt;br /&gt;
                        if shift == &amp;quot;f&amp;quot; then&lt;br /&gt;
                            shift = &amp;quot;d&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
            if r and ahead then&lt;br /&gt;
                r = ahead .. r&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local single = mw.text.trim( apply )&lt;br /&gt;
            if single == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false&lt;br /&gt;
            else&lt;br /&gt;
                local lapsus, slot&lt;br /&gt;
                slang = Multilingual.findCode( single )&lt;br /&gt;
                if slang then&lt;br /&gt;
                    if alien == &amp;quot;-&amp;quot; then&lt;br /&gt;
                        r = slang&lt;br /&gt;
                    elseif alien == &amp;quot;#&amp;quot; then&lt;br /&gt;
                        r = slang:lower()&lt;br /&gt;
                    else&lt;br /&gt;
                        r = Multilingual.getName( slang, alien )&lt;br /&gt;
                        if active then&lt;br /&gt;
                            slot = fill( slang, false, frame )&lt;br /&gt;
                            if slot then&lt;br /&gt;
                                local wlink = fetch( &amp;quot;WLink&amp;quot; )&lt;br /&gt;
                                if wlink  and&lt;br /&gt;
                                   type( wlink.getTarget )&lt;br /&gt;
                                                       == &amp;quot;function&amp;quot; then&lt;br /&gt;
                                    slot = wlink.getTarget( slot )&lt;br /&gt;
                                end&lt;br /&gt;
                            else&lt;br /&gt;
                                lapsus = alert&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = single&lt;br /&gt;
                    if active then&lt;br /&gt;
                        local title = mw.title.makeTitle( 0, single )&lt;br /&gt;
                        if title.exists then&lt;br /&gt;
                            slot = single&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                    lapsus = alert&lt;br /&gt;
                end&lt;br /&gt;
                if not r then&lt;br /&gt;
                    r = single&lt;br /&gt;
                elseif alter == &amp;quot;c&amp;quot; or alter == &amp;quot;f&amp;quot; then&lt;br /&gt;
                    r = mw.ustring.upper( mw.ustring.sub( r, 1, 1 ) )&lt;br /&gt;
                        .. mw.ustring.sub( r, 2 )&lt;br /&gt;
                elseif alter == &amp;quot;d&amp;quot; then&lt;br /&gt;
                    if Multilingual.isMinusculable( slang, r ) then&lt;br /&gt;
                        r = mw.ustring.lower( r )&lt;br /&gt;
                    end&lt;br /&gt;
                elseif alter == &amp;quot;m&amp;quot; then&lt;br /&gt;
                    if Multilingual.isMinusculable( slang, r ) then&lt;br /&gt;
                        r = mw.ustring.lower( mw.ustring.sub( r, 1, 1 ) )&lt;br /&gt;
                            .. mw.ustring.sub( r, 2 )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if slot then&lt;br /&gt;
                    if r == slot then&lt;br /&gt;
                        r = string.format( &amp;quot;[[%s]]&amp;quot;, r )&lt;br /&gt;
                    else&lt;br /&gt;
                        r = string.format( &amp;quot;[[%s|%s]]&amp;quot;, slot, r )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if lapsus and alert then&lt;br /&gt;
                    r = string.format( &amp;quot;%s[[Category:%s]]&amp;quot;, r, alert )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getBase = function ( ask )&lt;br /&gt;
    -- Retrieve base language from possibly combined ISO language code&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if ask then&lt;br /&gt;
        local slang = ask:match( &amp;quot;^%s*(%a%a%a?)-?%a*%s*$&amp;quot; )&lt;br /&gt;
        if slang then&lt;br /&gt;
            r = slang:lower()&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getBase()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getLang = function ( ask )&lt;br /&gt;
    -- Retrieve components of a RFC 5646 language code&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language code with subtags&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns table with formatted subtags&lt;br /&gt;
    --             .base&lt;br /&gt;
    --             .region&lt;br /&gt;
    --             .script&lt;br /&gt;
    --             .suggest&lt;br /&gt;
    --             .year&lt;br /&gt;
    --             .extension&lt;br /&gt;
    --             .other&lt;br /&gt;
    --             .n&lt;br /&gt;
    local tags = mw.text.split( ask, &amp;quot;-&amp;quot; )&lt;br /&gt;
    local s    = tags[ 1 ]&lt;br /&gt;
    local r&lt;br /&gt;
    if s:match( &amp;quot;^%a%a%a?$&amp;quot; ) then&lt;br /&gt;
        r = { base  = s:lower(),&lt;br /&gt;
              legal = true,&lt;br /&gt;
              n     = #tags }&lt;br /&gt;
        for i = 2, r.n do&lt;br /&gt;
            s = tags[ i ]&lt;br /&gt;
            if #s == 2 then&lt;br /&gt;
                if r.region  or  not s:match( &amp;quot;%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                else&lt;br /&gt;
                    r.region = s:upper()&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 4 then&lt;br /&gt;
                if s:match( &amp;quot;%a%a%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = ( not r.script )&lt;br /&gt;
                    r.script = s:sub( 1, 1 ):upper() ..&lt;br /&gt;
                               s:sub( 2 ):lower()&lt;br /&gt;
                elseif s:match( &amp;quot;20%d%d&amp;quot; )  or&lt;br /&gt;
                       s:match( &amp;quot;1%d%d%d&amp;quot; ) then&lt;br /&gt;
                    r.legal = ( not r.year )&lt;br /&gt;
                    r.year = s&lt;br /&gt;
                else&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 3 then&lt;br /&gt;
                if r.extlang  or  not s:match( &amp;quot;%a%a%a&amp;quot; ) then&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                else&lt;br /&gt;
                    r.extlang = s:lower()&lt;br /&gt;
                end&lt;br /&gt;
            elseif #s == 1 then&lt;br /&gt;
                s = s:lower()&lt;br /&gt;
                if s:match( &amp;quot;[tux]&amp;quot; ) then&lt;br /&gt;
                    r.extension = s&lt;br /&gt;
                    for k = i + 1, r.n do&lt;br /&gt;
                        s = tags[ k ]&lt;br /&gt;
                        if s:match( &amp;quot;^%w+$&amp;quot; ) then&lt;br /&gt;
                            r.extension = string.format( &amp;quot;%s-%s&amp;quot;,&lt;br /&gt;
                                                         r.extension, s )&lt;br /&gt;
                        else&lt;br /&gt;
                            r.legal = false&lt;br /&gt;
                        end&lt;br /&gt;
                    end -- for k&lt;br /&gt;
                else&lt;br /&gt;
                    r.legal = false&lt;br /&gt;
                end&lt;br /&gt;
                break -- for i&lt;br /&gt;
            else&lt;br /&gt;
                r.legal = ( not r.other )  and&lt;br /&gt;
                          s:match( &amp;quot;%a%a%a&amp;quot; )&lt;br /&gt;
                r.other = s:lower()&lt;br /&gt;
            end&lt;br /&gt;
            if not r.legal then&lt;br /&gt;
                break -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        if r.legal then&lt;br /&gt;
            r.suggest = Multilingual.fix( r.base )&lt;br /&gt;
            if r.suggest then&lt;br /&gt;
                r.legal = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = { legal = false }&lt;br /&gt;
    end&lt;br /&gt;
    if not r.legal then&lt;br /&gt;
        local cnf = fetch( &amp;quot;Multilingual&amp;quot;, &amp;quot;config&amp;quot; )&lt;br /&gt;
        if cnf  and  type( cnf.scream ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            r.scream = cnf.scream&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.getName = function ( ask, alien )&lt;br /&gt;
    -- Which name is assigned to this language code?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask    -- language code&lt;br /&gt;
    --     alien  -- language of the answer&lt;br /&gt;
    --               -- nil, false, &amp;quot;*&amp;quot;: native&lt;br /&gt;
    --               -- &amp;quot;!&amp;quot;: current project&lt;br /&gt;
    --               -- any valid code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if ask then&lt;br /&gt;
        local slang   = alien&lt;br /&gt;
        local tLang&lt;br /&gt;
        if slang then&lt;br /&gt;
            if slang == &amp;quot;*&amp;quot; then&lt;br /&gt;
                slang = Multilingual.fair( ask )&lt;br /&gt;
            elseif slang == &amp;quot;!&amp;quot; then&lt;br /&gt;
                slang = favorites()[ 1 ]&lt;br /&gt;
            else&lt;br /&gt;
                slang = Multilingual.fair( slang )&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            slang = Multilingual.fair( ask )&lt;br /&gt;
        end&lt;br /&gt;
        if not slang then&lt;br /&gt;
            slang = ask or &amp;quot;?????&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        slang = slang:lower()&lt;br /&gt;
        tLang = fetch( &amp;quot;Multilingual&amp;quot;, &amp;quot;names&amp;quot; )&lt;br /&gt;
        if tLang then&lt;br /&gt;
            tLang = tLang[ slang ]&lt;br /&gt;
            if tLang then&lt;br /&gt;
                r = tLang[ ask ]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            if not Multilingual.ext.tMW then&lt;br /&gt;
                Multilingual.ext.tMW = { }&lt;br /&gt;
            end&lt;br /&gt;
            tLang = Multilingual.ext.tMW[ slang ]&lt;br /&gt;
            if tLang == nil then&lt;br /&gt;
                tLang = mw.language.fetchLanguageNames( slang )&lt;br /&gt;
                if tLang then&lt;br /&gt;
                    Multilingual.ext.tMW[ slang ] = tLang&lt;br /&gt;
                else&lt;br /&gt;
                    Multilingual.ext.tMW[ slang ] = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if tLang then&lt;br /&gt;
                r = tLang[ ask ]&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            r = mw.language.fetchLanguageName( ask:lower(), slang )&lt;br /&gt;
            if r == &amp;quot;&amp;quot; then&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.getName()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.i18n = function ( available, alt, frame )&lt;br /&gt;
    -- Select translatable message&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     available  -- table, with mapping language code ./. text&lt;br /&gt;
    --     alt        -- string|nil|false, with fallback text&lt;br /&gt;
    --     frame      -- frame, if available&lt;br /&gt;
    --     Returns&lt;br /&gt;
    --         1. string|nil|false, with selected message&lt;br /&gt;
    --         2. string|nil|false, with language code&lt;br /&gt;
    local r1, r2&lt;br /&gt;
    if type( available ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local codes = { }&lt;br /&gt;
        local trsl  = { }&lt;br /&gt;
        local slang&lt;br /&gt;
        for k, v in pairs( available ) do&lt;br /&gt;
            if type( k ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
               type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                slang = mw.text.trim( k:lower() )&lt;br /&gt;
                table.insert( codes, slang )&lt;br /&gt;
                trsl[ slang ] = v&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        slang = Multilingual.userLang( codes, frame )&lt;br /&gt;
        if slang  and  trsl[ slang ] then&lt;br /&gt;
            r1 = mw.text.trim( trsl[ slang ] )&lt;br /&gt;
            if r1 == &amp;quot;&amp;quot; then&lt;br /&gt;
                r1 = false&lt;br /&gt;
            else&lt;br /&gt;
                r2 = slang&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not r1  and  type( alt ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r1 = mw.text.trim( alt )&lt;br /&gt;
        if r1 == &amp;quot;&amp;quot; then&lt;br /&gt;
            r1 = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2&lt;br /&gt;
end -- Multilingual.i18n()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.int = function ( access, alien, apply )&lt;br /&gt;
    -- Translated system message&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- message ID&lt;br /&gt;
    --     alien   -- language code&lt;br /&gt;
    --     apply   -- nil, or sequence table with parameters $1, $2, ...&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or false&lt;br /&gt;
    local o = mw.message.new( access )&lt;br /&gt;
    local r&lt;br /&gt;
    if o:exists() then&lt;br /&gt;
        if type( alien ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            o:inLanguage( alien:lower() )&lt;br /&gt;
        end&lt;br /&gt;
        if type( apply ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            o:params( apply )&lt;br /&gt;
        end&lt;br /&gt;
        r = o:plain()&lt;br /&gt;
    end&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Multilingual.int()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isLang = function ( ask, additional )&lt;br /&gt;
    -- Could this be an ISO language code?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask         -- language code&lt;br /&gt;
    --     additional  -- true, if Wiki codes like &amp;quot;simple&amp;quot; permitted&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r, s&lt;br /&gt;
    if additional then&lt;br /&gt;
        s = ask&lt;br /&gt;
    else&lt;br /&gt;
        s = Multilingual.getBase( ask )&lt;br /&gt;
    end&lt;br /&gt;
    if s then&lt;br /&gt;
        r = mw.language.isKnownLanguageTag( s )&lt;br /&gt;
        if r then&lt;br /&gt;
            r = not Multilingual.fix( s )&lt;br /&gt;
        elseif additional then&lt;br /&gt;
            r = Multilingual.exotic[ s ] or false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isLangWiki = function ( ask )&lt;br /&gt;
    -- Could this be a Wiki language version?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- language version specifier&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r&lt;br /&gt;
    local s = Multilingual.getBase( ask )&lt;br /&gt;
    if s then&lt;br /&gt;
        r = mw.language.isSupportedLanguage( s )  or&lt;br /&gt;
            Multilingual.exotic[ ask ]&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isLangWiki()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isMinusculable = function ( ask, assigned )&lt;br /&gt;
    -- Could this language name become downcased?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask       -- language code, or nil&lt;br /&gt;
    --     assigned  -- language name, or nil&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns boolean&lt;br /&gt;
    local r = true&lt;br /&gt;
    if ask then&lt;br /&gt;
        local cnf = fetch( &amp;quot;Multilingual&amp;quot;, &amp;quot;config&amp;quot; )&lt;br /&gt;
        if cnf then&lt;br /&gt;
            local s = string.format( &amp;quot; %s &amp;quot;, ask:lower() )&lt;br /&gt;
            if type( cnf.stopMinusculization ) == &amp;quot;string&amp;quot;&lt;br /&gt;
               and  cnf.stopMinusculization:find( s, 1, true ) then&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
            if r  and  assigned&lt;br /&gt;
               and  type( cnf.seekMinusculization ) == &amp;quot;string&amp;quot;&lt;br /&gt;
               and  cnf.seekMinusculization:find( s, 1, true )&lt;br /&gt;
               and  type( cnf.scanMinusculization ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                local scan = assigned:gsub( &amp;quot;[%(%)]&amp;quot;, &amp;quot; &amp;quot; ) .. &amp;quot; &amp;quot;&lt;br /&gt;
                if not scan:find( cnf.scanMinusculization ) then&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isMinusculable()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.isRTL = function ( ask )&lt;br /&gt;
    -- Check whether language is written right-to-left&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     ask  -- string, with language (or script) code&lt;br /&gt;
    -- Returns true, if right-to-left&lt;br /&gt;
    local r&lt;br /&gt;
    Multilingual.rtl = Multilingual.rtl or { }&lt;br /&gt;
    r = Multilingual.rtl[ ask ]&lt;br /&gt;
    if type( r ) ~= &amp;quot;boolean&amp;quot; then&lt;br /&gt;
        local bib = fetch( &amp;quot;ISO15924&amp;quot; )&lt;br /&gt;
        if type( bib ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
           type( bib.isRTL ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            r = bib.isRTL( ask )&lt;br /&gt;
        else&lt;br /&gt;
            r = mw.language.new( ask ):isRTL()&lt;br /&gt;
        end&lt;br /&gt;
        Multilingual.rtl[ ask ] = r&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Multilingual.isRTL()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.message = function ( arglist, frame )&lt;br /&gt;
    -- Show text in best match of user language like system message&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     arglist  -- template arguments&lt;br /&gt;
    --     frame    -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with appropriate text&lt;br /&gt;
    local r&lt;br /&gt;
    if type( arglist ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local t = { }&lt;br /&gt;
        local m, p, save&lt;br /&gt;
        for k, v in pairs( arglist ) do&lt;br /&gt;
            if type( k ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
               type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                v = mw.text.trim( v )&lt;br /&gt;
                if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    if k:match( &amp;quot;^%l%l&amp;quot; ) then&lt;br /&gt;
                        t[ k ] = v&lt;br /&gt;
                    elseif k:match( &amp;quot;^%$%d$&amp;quot; )  and  k ~= &amp;quot;$0&amp;quot; then&lt;br /&gt;
                        p = p or { }&lt;br /&gt;
                        k = tonumber( k:match( &amp;quot;^%$(%d)$&amp;quot; ) )&lt;br /&gt;
                        p[ k ] = v&lt;br /&gt;
                        if not m  or  k &amp;gt; m then&lt;br /&gt;
                            m = k&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if type( arglist[ &amp;quot;-&amp;quot; ] ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            save = arglist[ arglist[ &amp;quot;-&amp;quot; ] ]&lt;br /&gt;
        end&lt;br /&gt;
        r = Multilingual.i18n( t, save, frame )&lt;br /&gt;
        if p  and  r  and  r:find( &amp;quot;$&amp;quot;, 1, true ) then&lt;br /&gt;
            t = { }&lt;br /&gt;
            for i = 1, m do&lt;br /&gt;
                t[ i ] = p[ i ]  or  &amp;quot;&amp;quot;&lt;br /&gt;
            end -- for i&lt;br /&gt;
            r = mw.message.newRawMessage( r, t ):plain()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- Multilingual.message()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.sitelink = function ( all, frame )&lt;br /&gt;
    -- Make link at local or other site with optimal linktext translation&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     all    -- string or table or number, item ID or entity&lt;br /&gt;
    --     frame  -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with any helpful internal link, or plain text&lt;br /&gt;
    local s = type( all )&lt;br /&gt;
    local object, r&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        object = all&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        object = mw.wikibase.getEntity( all )&lt;br /&gt;
    elseif s == &amp;quot;number&amp;quot; then&lt;br /&gt;
        object = mw.wikibase.getEntity( string.format( &amp;quot;Q%d&amp;quot;, all ) )&lt;br /&gt;
    end&lt;br /&gt;
    if type( object ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local collection = object.sitelinks&lt;br /&gt;
        local entry&lt;br /&gt;
        s = false&lt;br /&gt;
        if type( collection ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            Multilingual.site = Multilingual.site  or&lt;br /&gt;
                                mw.wikibase.getGlobalSiteId()&lt;br /&gt;
            entry = collection[ Multilingual.site ]&lt;br /&gt;
            if entry then&lt;br /&gt;
                s = &amp;quot;:&amp;quot; .. entry.title&lt;br /&gt;
            elseif collection.enwiki then&lt;br /&gt;
                s = &amp;quot;w:en:&amp;quot; .. collection.enwiki.title&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        r = Multilingual.wikibase( object, &amp;quot;labels&amp;quot;, frame )&lt;br /&gt;
        if s then&lt;br /&gt;
            if s == &amp;quot;:&amp;quot; .. r then&lt;br /&gt;
                r = string.format( &amp;quot;[[%s]]&amp;quot;, s )&lt;br /&gt;
            else&lt;br /&gt;
                r = string.format( &amp;quot;[[%s|%s]]&amp;quot;, s, r )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- Multilingual.sitelink()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.tabData = function ( access, at, alt, frame )&lt;br /&gt;
    -- Retrieve translated keyword from commons:Data:****.tab&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access  -- string, with page identification on Commons&lt;br /&gt;
    --     at      -- string, with keyword&lt;br /&gt;
    --     alt     -- string|nil|false, with fallback text&lt;br /&gt;
    --     frame   -- frame, if available&lt;br /&gt;
    --     Returns&lt;br /&gt;
    --         1. string|nil|false, with selected message&lt;br /&gt;
    --         2. language code, or &amp;quot;error&amp;quot;&lt;br /&gt;
    local data = fetchData( access )&lt;br /&gt;
    local r1, r2&lt;br /&gt;
    if  type( data ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if type( at ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            local seek = mw.text.trim( at )&lt;br /&gt;
            if seek == &amp;quot;&amp;quot; then&lt;br /&gt;
                r1 = &amp;quot;EMPTY Multilingual.tabData key&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local e, poly&lt;br /&gt;
                for i = 1, #data do&lt;br /&gt;
                    e = data[ i ]&lt;br /&gt;
                    if type( e ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                        if e[ 1 ] == seek then&lt;br /&gt;
                            if type( e[ 2 ] ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                                poly = e[ 2 ]&lt;br /&gt;
                            else&lt;br /&gt;
                                r1 = &amp;quot;INVALID Multilingual.tabData bad #&amp;quot;&lt;br /&gt;
                                                         .. tostring( i )&lt;br /&gt;
                            end&lt;br /&gt;
                            break   -- for i&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        break   -- for i&lt;br /&gt;
                    end&lt;br /&gt;
                end   -- for i&lt;br /&gt;
                if poly then&lt;br /&gt;
                    data = poly&lt;br /&gt;
                else&lt;br /&gt;
                    r1 = &amp;quot;UNKNOWN Multilingual.tabData key: &amp;quot; .. seek&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r1 = &amp;quot;INVALID Multilingual.tabData key&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r1 = data&lt;br /&gt;
    end&lt;br /&gt;
    if r1 then&lt;br /&gt;
        r2 = &amp;quot;error&amp;quot;&lt;br /&gt;
    elseif data then&lt;br /&gt;
        r1, r2 = Multilingual.i18n( data, alt, frame )&lt;br /&gt;
        r2 = r2 or &amp;quot;error&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2&lt;br /&gt;
end -- Multilingual.tabData()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.userLang = function ( accept, frame )&lt;br /&gt;
    -- Try to support user language by application&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     accept  -- string or table&lt;br /&gt;
    --                space separated list of available ISO 639 codes&lt;br /&gt;
    --                Default: project language, or English&lt;br /&gt;
    --     frame   -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string with appropriate code&lt;br /&gt;
    local s = type( accept )&lt;br /&gt;
    local codes, r, slang&lt;br /&gt;
    if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        codes = mw.text.split( accept:lower(), &amp;quot;%s+&amp;quot; )&lt;br /&gt;
    elseif s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        codes = { }&lt;br /&gt;
        for i = 1, #accept do&lt;br /&gt;
            s = accept[ i ]&lt;br /&gt;
            if type( s ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
               s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                table.insert( codes, s:lower() )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
    end&lt;br /&gt;
    slang = User.favorize( codes, frame )&lt;br /&gt;
    if slang then&lt;br /&gt;
        if feasible( slang, codes ) then&lt;br /&gt;
            r = slang&lt;br /&gt;
        elseif slang:find( &amp;quot;-&amp;quot;, 1, true ) then&lt;br /&gt;
            slang = Multilingual.getBase( slang )&lt;br /&gt;
            if feasible( slang, codes ) then&lt;br /&gt;
                r = slang&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if not r then&lt;br /&gt;
            local others = mw.language.getFallbacksFor( slang )&lt;br /&gt;
            for i = 1, #others do&lt;br /&gt;
                slang = others[ i ]&lt;br /&gt;
                if feasible( slang, codes ) then&lt;br /&gt;
                    r = slang&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 r then&lt;br /&gt;
        local back = favorites()&lt;br /&gt;
        for i = 1, #back do&lt;br /&gt;
            slang = back[ i ]&lt;br /&gt;
            if feasible( slang, codes ) then&lt;br /&gt;
                r = slang&lt;br /&gt;
                break -- for i&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
        if not r  and  codes[ 1 ] then&lt;br /&gt;
            r = codes[ 1 ]&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r  or  favorites()[ 1 ]&lt;br /&gt;
end -- Multilingual.userLang()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.userLangCode = function ()&lt;br /&gt;
    -- Guess a user language code&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns code of current best guess&lt;br /&gt;
    return User.self  or  favorites()[ 1 ]&lt;br /&gt;
end -- Multilingual.userLangCode()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Multilingual.wikibase = function ( all, about, attempt, frame )&lt;br /&gt;
    -- Optimal translation of wikibase component&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     all      -- string or table, object ID or entity&lt;br /&gt;
    --     about    -- boolean, true &amp;quot;descriptions&amp;quot; or false &amp;quot;labels&amp;quot;&lt;br /&gt;
    --     attempt  -- string or not, code of preferred language&lt;br /&gt;
    --     frame    -- frame, if available&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns&lt;br /&gt;
    --         1. string, with selected message&lt;br /&gt;
    --         2. string, with language code, or not&lt;br /&gt;
    local s = type( all )&lt;br /&gt;
    local object, r, r2&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        object = all&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        object = mw.wikibase.getEntity( all )&lt;br /&gt;
    end&lt;br /&gt;
    if type( object ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if about  and  about ~= &amp;quot;labels&amp;quot; then&lt;br /&gt;
            s = &amp;quot;descriptions&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            s = &amp;quot;labels&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        object = object[ s ]&lt;br /&gt;
        if type( object ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            if object[ attempt ] then&lt;br /&gt;
                r  = object[ attempt ].value&lt;br /&gt;
                r2 = attempt&lt;br /&gt;
            else&lt;br /&gt;
                local poly&lt;br /&gt;
                for k, v in pairs( object ) do&lt;br /&gt;
                    poly = poly or { }&lt;br /&gt;
                    poly[ k ] = v.value&lt;br /&gt;
                end -- for k, v&lt;br /&gt;
                if poly then&lt;br /&gt;
                    r, r2 = Multilingual.i18n( poly, nil, frame )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r  or  &amp;quot;&amp;quot;,   r2&lt;br /&gt;
end -- Multilingual.wikibase()&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&lt;br /&gt;
    --                         or wikidata|item|~|@ or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-17&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local last    = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked  = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link    = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  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 suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if link then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&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;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&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;
    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;
&lt;br /&gt;
&lt;br /&gt;
p.fair = function ( frame )&lt;br /&gt;
    -- Format language code&lt;br /&gt;
    --     1  -- language code&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    return Multilingual.fair( s )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.fair&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.fallback = function ( frame )&lt;br /&gt;
    -- Is another language suitable as replacement?&lt;br /&gt;
    --     1  -- language version specifier to be supported&lt;br /&gt;
    --     2  -- language specifier of a possible replacement&lt;br /&gt;
    local s1 = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local s2 = mw.text.trim( frame.args[ 2 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local r  = Multilingual.fallback( s1, s2 )&lt;br /&gt;
    if type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = r[ 1 ]&lt;br /&gt;
    else&lt;br /&gt;
        r = r  and  &amp;quot;1&amp;quot;   or   &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.fallback&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.findCode = function ( frame )&lt;br /&gt;
    -- Retrieve language code from language name&lt;br /&gt;
    --     1  -- name in current project language&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    return Multilingual.findCode( s )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.findCode&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.fix = function ( frame )&lt;br /&gt;
    local r = frame.args[ 1 ]&lt;br /&gt;
    if r then&lt;br /&gt;
        r = Multilingual.fix( mw.text.trim( r ) )&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.fix&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.format = function ( frame )&lt;br /&gt;
    -- Format one or more languages&lt;br /&gt;
    --     1          -- language list or item&lt;br /&gt;
    --     slang      -- language of the answer, if not native&lt;br /&gt;
    --                   * -- native&lt;br /&gt;
    --                   ! -- current project&lt;br /&gt;
    --                   any valid code&lt;br /&gt;
    --     shift      -- capitalize, if &amp;quot;c&amp;quot;; downcase, if &amp;quot;d&amp;quot;&lt;br /&gt;
    --                   capitalize first item only, if &amp;quot;f&amp;quot;&lt;br /&gt;
    --     link       -- 1 -- link items&lt;br /&gt;
    --     scream     -- category title in case of error&lt;br /&gt;
    --     split      -- split pattern, if list expected&lt;br /&gt;
    --     separator  -- list separator, else split&lt;br /&gt;
    --     start      -- prepend first element, if any&lt;br /&gt;
    local r&lt;br /&gt;
    local link&lt;br /&gt;
    if frame.args.link == &amp;quot;1&amp;quot; then&lt;br /&gt;
        link = true&lt;br /&gt;
    end&lt;br /&gt;
    r = Multilingual.format( frame.args[ 1 ],&lt;br /&gt;
                             frame.args.slang,&lt;br /&gt;
                             frame.args.shift,&lt;br /&gt;
                             link,&lt;br /&gt;
                             frame.args.scream,&lt;br /&gt;
                             frame,&lt;br /&gt;
                             frame.args.split,&lt;br /&gt;
                             frame.args.separator,&lt;br /&gt;
                             frame.args.start )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.format&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.getBase = function ( frame )&lt;br /&gt;
    -- Retrieve base language from possibly combined ISO language code&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    return Multilingual.getBase( s )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.getBase&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.getName = function ( frame )&lt;br /&gt;
    -- Retrieve language name from ISO language code&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    --     2  -- language to be used for the answer, if not native&lt;br /&gt;
    --           ! -- current project&lt;br /&gt;
    --           * -- native&lt;br /&gt;
    --           any valid code&lt;br /&gt;
    local s     = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local slang = frame.args[ 2 ]&lt;br /&gt;
    local r&lt;br /&gt;
    Multilingual.frame = frame&lt;br /&gt;
    if slang then&lt;br /&gt;
        slang = mw.text.trim( slang )&lt;br /&gt;
    end&lt;br /&gt;
    r = Multilingual.getName( s, slang )&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.getName&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.int = function ( frame )&lt;br /&gt;
    -- Translated system message&lt;br /&gt;
    --     1             -- message ID&lt;br /&gt;
    --     lang          -- language code&lt;br /&gt;
    --     $1, $2, ...   -- parameters&lt;br /&gt;
    local sysMsg = frame.args[ 1 ]&lt;br /&gt;
    local r&lt;br /&gt;
    if sysMsg then&lt;br /&gt;
        sysMsg = mw.text.trim( sysMsg )&lt;br /&gt;
        if sysMsg ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            local n     = 0&lt;br /&gt;
            local slang = frame.args.lang&lt;br /&gt;
            local i, params, s&lt;br /&gt;
            if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
                slang = false&lt;br /&gt;
            end&lt;br /&gt;
            for k, v in pairs( frame.args ) do&lt;br /&gt;
                if type( k ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                    s = k:match( &amp;quot;^%$(%d+)$&amp;quot; )&lt;br /&gt;
                    if s then&lt;br /&gt;
                        i = tonumber( s )&lt;br /&gt;
                        if i &amp;gt; n then&lt;br /&gt;
                            n = i&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
            if n &amp;gt; 0 then&lt;br /&gt;
                local s&lt;br /&gt;
                params = { }&lt;br /&gt;
                for i = 1, n do&lt;br /&gt;
                    s = frame.args[ &amp;quot;$&amp;quot; .. tostring( i ) ]  or  &amp;quot;&amp;quot;&lt;br /&gt;
                    table.insert( params, s )&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
            r = Multilingual.int( sysMsg, slang, params )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.int&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.isLang = function ( frame )&lt;br /&gt;
    -- Could this be an ISO language code?&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local lucky, r = pcall( Multilingual.isLang, s )&lt;br /&gt;
    return r and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isLang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.isLangWiki = function ( frame )&lt;br /&gt;
    -- Could this be a Wiki language version?&lt;br /&gt;
    --     1  -- code&lt;br /&gt;
    -- Returns non-empty, if possibly language version&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local lucky, r = pcall( Multilingual.isLangWiki, s )&lt;br /&gt;
    return r and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isLangWiki&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.isRTL = function ( frame )&lt;br /&gt;
    -- Check whether language is written right-to-left&lt;br /&gt;
    --     1  -- string, with language code&lt;br /&gt;
    -- Returns non-empty, if right-to-left&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    return Multilingual.isRTL( s ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.isRTL()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.message = function ( frame )&lt;br /&gt;
    -- Translation of text element&lt;br /&gt;
    return Multilingual.message( fold( frame ), frame )&lt;br /&gt;
end -- p.message&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.sitelink = function ( frame )&lt;br /&gt;
    -- Make link at local or other site with optimal linktext translation&lt;br /&gt;
    --     1  -- item ID&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if s:match( &amp;quot;^%d+$&amp;quot;) then&lt;br /&gt;
        r = tonumber( s )&lt;br /&gt;
    elseif s:match( &amp;quot;^Q%d+$&amp;quot;) then&lt;br /&gt;
        r = s&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        r = Multilingual.sitelink( r, frame )&lt;br /&gt;
    end&lt;br /&gt;
    return r or s&lt;br /&gt;
end -- p.sitelink&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.tabData = function ( frame )&lt;br /&gt;
    -- Retrieve best message text from Commons Data&lt;br /&gt;
    --     1    -- page identification on Commons&lt;br /&gt;
    --     2    -- keyword&lt;br /&gt;
    --     alt  -- fallback text&lt;br /&gt;
    local suite = frame.args[ 1 ]&lt;br /&gt;
    local seek  = frame.args[ 2 ]&lt;br /&gt;
    local salt  = frame.args.alt&lt;br /&gt;
    local r     = Multilingual.tabData( suite, seek, salt, frame )&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.tabData&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.userLang = function ( frame )&lt;br /&gt;
    -- Which language does the current user prefer?&lt;br /&gt;
    --     1  -- space separated list of available ISO 639 codes&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    return Multilingual.userLang( s, frame )&lt;br /&gt;
end -- p.userLang&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.wikibase = function ( frame )&lt;br /&gt;
    -- Optimal translation of wikibase component&lt;br /&gt;
    --     1  -- object ID&lt;br /&gt;
    --     2  -- 1 for &amp;quot;descriptions&amp;quot;, 0 for &amp;quot;labels&amp;quot;.&lt;br /&gt;
    --           or either &amp;quot;descriptions&amp;quot; or &amp;quot;labels&amp;quot;&lt;br /&gt;
    local r&lt;br /&gt;
    local s = mw.text.trim( frame.args[ 1 ]  or  &amp;quot;&amp;quot; )&lt;br /&gt;
    if s ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local s2    = mw.text.trim( frame.args[ 2 ]  or  &amp;quot;0&amp;quot; )&lt;br /&gt;
        local slang = mw.text.trim( frame.args.lang  or  &amp;quot;&amp;quot; )&lt;br /&gt;
        local large = ( s2 ~= &amp;quot;&amp;quot;  and  s2 ~= &amp;quot;0&amp;quot; )&lt;br /&gt;
        if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
            slang = false&lt;br /&gt;
        end&lt;br /&gt;
        r = Multilingual.wikibase( s, large, slang, frame )&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.wikibase&lt;br /&gt;
&lt;br /&gt;
&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;
&lt;br /&gt;
&lt;br /&gt;
p.Multilingual = function ()&lt;br /&gt;
    return Multilingual&lt;br /&gt;
end -- p.Multilingual&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:JSONutil&amp;diff=384</id>
		<title>Modul:JSONutil</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:JSONutil&amp;diff=384"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local JSONutil = { suite  = &amp;quot;JSONutil&amp;quot;,&lt;br /&gt;
                   serial = &amp;quot;2020-11-08&amp;quot;,&lt;br /&gt;
                   item   = 63869449 }&lt;br /&gt;
--[=[&lt;br /&gt;
preprocess or generate JSON data&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local Failsafe = JSONutil&lt;br /&gt;
JSONutil.Encoder  = { stab   = string.char( 9 ),&lt;br /&gt;
                      sep    = string.char( 10 ),&lt;br /&gt;
                      scream = &amp;quot;@error@JSONencoder@&amp;quot; }&lt;br /&gt;
JSONutil.more = 50    -- length of trailing context&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local Fallback = function ()&lt;br /&gt;
    -- Retrieve current default language code&lt;br /&gt;
    --     Returns  string&lt;br /&gt;
    return mw.language.getContentLanguage():getCode()&lt;br /&gt;
                                           :lower()&lt;br /&gt;
end -- Fallback()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local flat = function ( adjust )&lt;br /&gt;
    -- Clean template argument string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local r&lt;br /&gt;
    if adjust then&lt;br /&gt;
        r = mw.text.trim( mw.text.unstripNoWiki( adjust ) )&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- flat()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local flip = function ( frame )&lt;br /&gt;
    -- Retrieve template argument indent&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     frame  -- object&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number, of indentation level, or not&lt;br /&gt;
    local r&lt;br /&gt;
    if frame.args.indent  and  frame.args.indent:match( &amp;quot;^%d+$&amp;quot; ) then&lt;br /&gt;
        r = tonumber( frame.args.indent )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- flip()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.Array = function ( apply, adapt, alert )&lt;br /&gt;
    -- Convert table to JSON Array&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- table, with sequence of raw elements, or&lt;br /&gt;
    --               string, with formatted Array, or empty&lt;br /&gt;
    --     adapt  -- string, with requested type, or not&lt;br /&gt;
    --     alert  -- true, if non-numeric elements shall trigger errors&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with JSON Array&lt;br /&gt;
    local r = type( apply )&lt;br /&gt;
    if r == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( apply )&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = &amp;quot;[]&amp;quot;&lt;br /&gt;
        elseif r:byte( 1, 1 ) ~= 0x5B  or&lt;br /&gt;
               r:byte( -1, -1 ) ~= 0x5D then&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    elseif r == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local n = 0&lt;br /&gt;
        local strange&lt;br /&gt;
        for k, v in pairs( apply ) do&lt;br /&gt;
            if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                if k &amp;gt; n then&lt;br /&gt;
                    n = k&lt;br /&gt;
                end&lt;br /&gt;
            elseif alert then&lt;br /&gt;
                if strange then&lt;br /&gt;
                    strange = strange .. &amp;quot; &amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    strange = &amp;quot;&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
                strange = strange .. tostring( k )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if strange then&lt;br /&gt;
            r = string.format( &amp;quot;{ \&amp;quot;%s\&amp;quot;: \&amp;quot;%s\&amp;quot; }&amp;quot;,&lt;br /&gt;
                               JSONutil.Encoder.scream,&lt;br /&gt;
                               JSONutil.Encoder.string( strange ) )&lt;br /&gt;
        elseif n &amp;gt; 0 then&lt;br /&gt;
            local sep   = &amp;quot;&amp;quot;&lt;br /&gt;
            local scope = adapt or &amp;quot;string&amp;quot;&lt;br /&gt;
            local s&lt;br /&gt;
            if type( JSONutil.Encoder[ scope ] ) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                scope = &amp;quot;string&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            r = &amp;quot; ]&amp;quot;&lt;br /&gt;
            for i = n, 1, -1 do&lt;br /&gt;
                s = JSONutil.Encoder[ scope ]( apply[ i ] )&lt;br /&gt;
                r = string.format( &amp;quot;%s%s%s&amp;quot;, s, sep, r )&lt;br /&gt;
                sep = &amp;quot;,\n  &amp;quot;&lt;br /&gt;
            end -- for i = n, 1, -1&lt;br /&gt;
            r = &amp;quot;[ &amp;quot; .. r&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;[]&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = string.format( &amp;quot;[ \&amp;quot;%s * %s\&amp;quot; ]&amp;quot;,&lt;br /&gt;
                           JSONutil.Encoder.scream,&lt;br /&gt;
                           &amp;quot;Bad Array&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- JSONutil.Encoder.Array()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.boolean = function ( apply )&lt;br /&gt;
    -- Convert string to JSON boolean&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with value&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     boolean as string&lt;br /&gt;
    local r = mw.text.trim( apply )&lt;br /&gt;
    if r == &amp;quot;&amp;quot;  or  r == &amp;quot;null&amp;quot;  or  r == &amp;quot;false&amp;quot;&lt;br /&gt;
       or  r == &amp;quot;0&amp;quot;  or  r == &amp;quot;-&amp;quot; then&lt;br /&gt;
        r = &amp;quot;false&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;true&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- JSONutil.Encoder.boolean()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.Component = function ( access, apply,&lt;br /&gt;
                                        adapt, align, alert )&lt;br /&gt;
    -- Create single entry for mapping object&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     access  -- string, with component name&lt;br /&gt;
    --     apply   -- component value&lt;br /&gt;
    --     adapt   -- string, with value type, or not&lt;br /&gt;
    --     align   -- number, of indentation level, or not&lt;br /&gt;
    --     alert   --&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with JSON fragment, and comma&lt;br /&gt;
    local v     = apply&lt;br /&gt;
    local types = adapt&lt;br /&gt;
    local indent, liner, scope, sep, sign&lt;br /&gt;
    if type( access ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        sign = mw.text.trim( access )&lt;br /&gt;
        if sign == &amp;quot;&amp;quot; then&lt;br /&gt;
            sign = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( types ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        types = mw.text.split( mw.text.trim( types ),  &amp;quot;%s+&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if type( types ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
        types = { }&lt;br /&gt;
        table.insert( types, &amp;quot;string&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if #types == 1 then&lt;br /&gt;
        scope = types[ 1 ]&lt;br /&gt;
    else&lt;br /&gt;
        for i = 1, #types do&lt;br /&gt;
            if types[ i ] == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                if v == &amp;quot;1&amp;quot;  or  v == 1  or  v == true then&lt;br /&gt;
                    v = &amp;quot;true&amp;quot;&lt;br /&gt;
                    scope = &amp;quot;boolean&amp;quot;&lt;br /&gt;
                elseif v == &amp;quot;0&amp;quot;  or  v == 0  or  v == false then&lt;br /&gt;
                    v = &amp;quot;false&amp;quot;&lt;br /&gt;
                    scope = &amp;quot;boolean&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
                if scope then&lt;br /&gt;
                    types = { }&lt;br /&gt;
                    break    -- for i&lt;br /&gt;
                else&lt;br /&gt;
                    table.remove( types, i )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end   -- for i&lt;br /&gt;
        for i = 1, #types do&lt;br /&gt;
            if types[ i ] == &amp;quot;number&amp;quot; then&lt;br /&gt;
                if tonumber( v ) then&lt;br /&gt;
                    v     = tostring( v )&lt;br /&gt;
                    scope = &amp;quot;number&amp;quot;&lt;br /&gt;
                    types = { }&lt;br /&gt;
                    break    -- for i&lt;br /&gt;
                else&lt;br /&gt;
                    table.remove( types, i )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end    -- for i&lt;br /&gt;
    end&lt;br /&gt;
    scope = scope or &amp;quot;string&amp;quot;&lt;br /&gt;
    if type( JSONutil.Encoder[ scope ] ) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
        scope = &amp;quot;string&amp;quot;&lt;br /&gt;
    elseif scope == &amp;quot;I18N&amp;quot; then&lt;br /&gt;
        scope = &amp;quot;Polyglott&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if scope == &amp;quot;string&amp;quot; then&lt;br /&gt;
        v = v or &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if type( align ) == &amp;quot;number&amp;quot;  and  align &amp;gt; 0 then&lt;br /&gt;
        indent = math.floor( align )&lt;br /&gt;
        if indent == 0 then&lt;br /&gt;
            indent = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if scope == &amp;quot;object&amp;quot;  or  not sign then&lt;br /&gt;
        liner = true&lt;br /&gt;
    elseif scope == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local k = mw.ustring.len( sign ) + mw.ustring.len( v )&lt;br /&gt;
        if k &amp;gt; 60 then&lt;br /&gt;
            liner = true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if liner then&lt;br /&gt;
        if indent then&lt;br /&gt;
            sep = &amp;quot;\n&amp;quot; .. string.rep( &amp;quot;  &amp;quot;, indent )&lt;br /&gt;
        else&lt;br /&gt;
            sep = &amp;quot;\n&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        sep = &amp;quot; &amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if indent then&lt;br /&gt;
        indent = indent + 1&lt;br /&gt;
    end&lt;br /&gt;
    return  string.format( &amp;quot; \&amp;quot;%s\&amp;quot;:%s%s,\n&amp;quot;,&lt;br /&gt;
                           sign or &amp;quot;???&amp;quot;,&lt;br /&gt;
                           sep,&lt;br /&gt;
                           JSONutil.Encoder[ scope ]( v, indent ) )&lt;br /&gt;
end -- JSONutil.Encoder.Component()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.Hash = function ( apply, adapt, alert )&lt;br /&gt;
    -- Create entries for mapping object&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- table, with element value assignments&lt;br /&gt;
    --     adapt  -- table, with value types assignment, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with JSON fragment, and comma&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local s&lt;br /&gt;
    for k, v in pairs( apply ) do&lt;br /&gt;
        if type( adapt ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            s = adapt[ k ]&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. JSONutil.Encoder.Component( tostring( k ), v, s )&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    return&lt;br /&gt;
end -- JSONutil.Encoder.Hash()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.I18N = function ( apply, align )&lt;br /&gt;
    -- Convert multilingual string table to JSON&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- table, with mapping object&lt;br /&gt;
    --     align  -- number, of indentation level, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with JSON object&lt;br /&gt;
    local r = type( apply )&lt;br /&gt;
    if r == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local strange&lt;br /&gt;
        local fault = function ( a )&lt;br /&gt;
                  if strange then&lt;br /&gt;
                      strange = strange .. &amp;quot; *\n &amp;quot;&lt;br /&gt;
                  else&lt;br /&gt;
                      strange = &amp;quot;&amp;quot;&lt;br /&gt;
                  end&lt;br /&gt;
                  strange = strange .. a&lt;br /&gt;
              end&lt;br /&gt;
        local got, sep, indent&lt;br /&gt;
        for k, v in pairs( apply ) do&lt;br /&gt;
            if type( k ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                k = mw.text.trim( k )&lt;br /&gt;
                if type( v ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                    v = mw.text.trim( v )&lt;br /&gt;
                    if v == &amp;quot;&amp;quot; then&lt;br /&gt;
                        fault( string.format( &amp;quot;%s %s=&amp;quot;,&lt;br /&gt;
                                              &amp;quot;Empty text&amp;quot;, k ) )&lt;br /&gt;
                    end&lt;br /&gt;
                    if not ( k:match( &amp;quot;%l%l%l?&amp;quot; )  or&lt;br /&gt;
                             k:match( &amp;quot;%l%l%l?-%u%u&amp;quot; )  or&lt;br /&gt;
                             k:match( &amp;quot;%l%l%l?-%u%l%l%l+&amp;quot; ) ) then&lt;br /&gt;
                        fault( string.format( &amp;quot;%s %s=&amp;quot;,&lt;br /&gt;
                                              &amp;quot;Strange language code&amp;quot;,&lt;br /&gt;
                                              k ) )&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    v = tostring( v )&lt;br /&gt;
                    fault( string.format( &amp;quot;%s %s=%s&amp;quot;,&lt;br /&gt;
                                          &amp;quot;Bad type for text&amp;quot;,&lt;br /&gt;
                                          k,&lt;br /&gt;
                                          type( v ) ) )&lt;br /&gt;
                end&lt;br /&gt;
                got = got  or  { }&lt;br /&gt;
                got[ k ] = v&lt;br /&gt;
            else&lt;br /&gt;
                fault( string.format( &amp;quot;%s %s: %s&amp;quot;,&lt;br /&gt;
                                      &amp;quot;Bad language code type&amp;quot;,&lt;br /&gt;
                                      type( k ),&lt;br /&gt;
                                      tostring( k ) ) )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if not got then&lt;br /&gt;
            fault( &amp;quot;No language codes&amp;quot; )&lt;br /&gt;
            got = { }&lt;br /&gt;
        end&lt;br /&gt;
        if strange then&lt;br /&gt;
            got[ JSONutil.Encoder.scream ] = strange&lt;br /&gt;
        end&lt;br /&gt;
        r = false&lt;br /&gt;
        if type( align ) == &amp;quot;number&amp;quot;  and  align &amp;gt; 0 then&lt;br /&gt;
            indent = math.floor( align ) &lt;br /&gt;
        else&lt;br /&gt;
            indent = 0&lt;br /&gt;
        end&lt;br /&gt;
        sep = string.rep( &amp;quot;  &amp;quot;,  indent + 1 ) &lt;br /&gt;
        for k, v in pairs( got ) do&lt;br /&gt;
            if r then&lt;br /&gt;
                r = r .. &amp;quot;,\n&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;%s  %s%s: %s&amp;quot;,&lt;br /&gt;
                               r,&lt;br /&gt;
                               sep,&lt;br /&gt;
                               JSONutil.Encoder.string( k ),&lt;br /&gt;
                               JSONutil.Encoder.string( v ) )&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        r = string.format( &amp;quot;{\n%s\n%s}&amp;quot;, r, sep )&lt;br /&gt;
    elseif r == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = JSONutil.Encoder.string( apply )&lt;br /&gt;
    else&lt;br /&gt;
        r = string.format( &amp;quot;{ \&amp;quot;%s\&amp;quot;: \&amp;quot;%s: %s\&amp;quot; }&amp;quot;,&lt;br /&gt;
                           JSONutil.Encoder.scream,&lt;br /&gt;
                           &amp;quot;Bad Lua type&amp;quot;,&lt;br /&gt;
                           r )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- JSONutil.Encoder.I18N()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.number = function ( apply )&lt;br /&gt;
    -- Convert string to JSON number&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with presumable number&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number, or &amp;quot;NaN&amp;quot;&lt;br /&gt;
    local s = mw.text.trim( apply )&lt;br /&gt;
    JSONutil.Encoder.minus = JSONutil.Encoder.minus  or&lt;br /&gt;
                             mw.ustring.char( 0x2212 )&lt;br /&gt;
    s = s:gsub( JSONutil.Encoder.minus, &amp;quot;-&amp;quot; )&lt;br /&gt;
    return tonumber( s:lower() )  or  &amp;quot;NaN&amp;quot;&lt;br /&gt;
end -- JSONutil.Encoder.number()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.object = function ( apply, align )&lt;br /&gt;
    -- Create mapping object&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with components, may end with comma&lt;br /&gt;
    --     align  -- number, of indentation level, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with JSON fragment&lt;br /&gt;
    local story = mw.text.trim( apply )&lt;br /&gt;
    local start = &amp;quot;&amp;quot;&lt;br /&gt;
    if story:sub( -1 ) == &amp;quot;,&amp;quot; then&lt;br /&gt;
        story = story:sub( 1, -2 )&lt;br /&gt;
    end&lt;br /&gt;
    if type( align ) == &amp;quot;number&amp;quot;  and  align &amp;gt; 0 then&lt;br /&gt;
        local indent = math.floor( align )&lt;br /&gt;
        if indent &amp;gt; 0 then&lt;br /&gt;
            start = string.rep( &amp;quot;  &amp;quot;, indent )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return  string.format( &amp;quot;%s{ %s\n%s}&amp;quot;, start, story, start )&lt;br /&gt;
end -- JSONutil.Encoder.object()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.Polyglott = function ( apply, align )&lt;br /&gt;
    -- Convert string or multilingual string table to JSON&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with string or object&lt;br /&gt;
    --     align  -- number, of indentation level, or not&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local r = type( apply )&lt;br /&gt;
    if r == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = mw.text.trim( apply )&lt;br /&gt;
        if not r:match( &amp;quot;^{%s*\&amp;quot;&amp;quot; )  or&lt;br /&gt;
           not r:match( &amp;quot;\&amp;quot;%s*}$&amp;quot; ) then&lt;br /&gt;
            r = JSONutil.Encoder.string( r )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = string.format( &amp;quot;{ \&amp;quot;%s\&amp;quot;: \&amp;quot;%s: %s\&amp;quot; }&amp;quot;,&lt;br /&gt;
                           JSONutil.Encoder.scream,&lt;br /&gt;
                           &amp;quot;Bad Lua type&amp;quot;,&lt;br /&gt;
                           r )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- JSONutil.Encoder.Polyglott()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.Encoder.string = function ( apply )&lt;br /&gt;
    -- Convert plain string to strict JSON string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with plain string&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, with quoted trimmed JSON string&lt;br /&gt;
    return  string.format( &amp;quot;\&amp;quot;%s\&amp;quot;&amp;quot;,&lt;br /&gt;
                           mw.text.trim( apply )&lt;br /&gt;
                                  :gsub( &amp;quot;\\&amp;quot;,  &amp;quot;\\\\&amp;quot; )&lt;br /&gt;
                                  :gsub( &amp;quot;\&amp;quot;&amp;quot;,  &amp;quot;\\\&amp;quot;&amp;quot; )&lt;br /&gt;
                                  :gsub( JSONutil.Encoder.sep,  &amp;quot;\\n&amp;quot; )&lt;br /&gt;
                                  :gsub( JSONutil.Encoder.stab, &amp;quot;\\t&amp;quot; ) )&lt;br /&gt;
end -- JSONutil.Encoder.string()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.fair = function ( apply )&lt;br /&gt;
    -- Reduce enhanced JSON data to strict JSON&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply  -- string, with enhanced JSON&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1    -- string|nil|false, with error keyword&lt;br /&gt;
    --     2    -- string, with JSON or context&lt;br /&gt;
    local m   = 0&lt;br /&gt;
    local n   = 0&lt;br /&gt;
    local s   = mw.text.trim( apply )&lt;br /&gt;
    local i, j, last, r, scan, sep0, sep1, start, stub, suffix&lt;br /&gt;
    local framework = function ( a )&lt;br /&gt;
                              -- syntax analysis outside strings&lt;br /&gt;
                              local k = 1&lt;br /&gt;
                              local c&lt;br /&gt;
                              while k do&lt;br /&gt;
                                  k = a:find( &amp;quot;[{%[%]}]&amp;quot;, k )&lt;br /&gt;
                                  if k then&lt;br /&gt;
                                      c = a:byte( k, k )&lt;br /&gt;
                                      if c == 0x7B then    -- {&lt;br /&gt;
                                          m = m + 1&lt;br /&gt;
                                      elseif c == 0x7D then    -- }&lt;br /&gt;
                                          m = m - 1&lt;br /&gt;
                                      elseif c == 0x5B then    -- [&lt;br /&gt;
                                          n = n + 1&lt;br /&gt;
                                      else    -- ]&lt;br /&gt;
                                          n = n - 1&lt;br /&gt;
                                      end&lt;br /&gt;
                                      k = k + 1&lt;br /&gt;
                                  end&lt;br /&gt;
                              end   -- while k&lt;br /&gt;
                      end    -- framework()&lt;br /&gt;
    local free = function ( a, at, f )&lt;br /&gt;
                     -- Throws: error if /* is not matched by */&lt;br /&gt;
                     local s = a&lt;br /&gt;
                     local i = s:find( &amp;quot;//&amp;quot;, at, true )&lt;br /&gt;
                     local k = s:find( &amp;quot;/*&amp;quot;, at, true )&lt;br /&gt;
                     if i or k then&lt;br /&gt;
                         local m = s:find( sep0, at )&lt;br /&gt;
                         if i   and   ( not m  or  i &amp;lt; m ) then&lt;br /&gt;
                             k = s:find( &amp;quot;\n&amp;quot;,  i + 2,  true )&lt;br /&gt;
                             if k then&lt;br /&gt;
                                 if i == 1 then&lt;br /&gt;
                                     s = s:sub( k + 1 )&lt;br /&gt;
                                 else&lt;br /&gt;
                                     s = s:sub( 1,  i - 1 )   ..&lt;br /&gt;
                                         s:sub( k + 1 )&lt;br /&gt;
                                 end&lt;br /&gt;
                             elseif i &amp;gt; 1 then&lt;br /&gt;
                                 s = s:sub( 1,  i - 1 )&lt;br /&gt;
                             else&lt;br /&gt;
                                 s = &amp;quot;&amp;quot;&lt;br /&gt;
                             end&lt;br /&gt;
                         elseif k   and   ( not m  or  k &amp;lt; m ) then&lt;br /&gt;
                             i = s:find( &amp;quot;*/&amp;quot;,  k + 2,  true )&lt;br /&gt;
                             if i then&lt;br /&gt;
                                 if k == 1 then&lt;br /&gt;
                                     s = s:sub( i + 2 )&lt;br /&gt;
                                 else&lt;br /&gt;
                                     s = s:sub( 1,  k - 1 )   ..&lt;br /&gt;
                                         s:sub( i + 2 )&lt;br /&gt;
                                 end&lt;br /&gt;
                             else&lt;br /&gt;
                                 error( s:sub( k + 2 ), 0 )&lt;br /&gt;
                             end&lt;br /&gt;
                             i = k&lt;br /&gt;
                         else&lt;br /&gt;
                             i = false&lt;br /&gt;
                         end&lt;br /&gt;
                         if i then&lt;br /&gt;
                             s = mw.text.trim( s )&lt;br /&gt;
                             if s:find( &amp;quot;/&amp;quot;, 1, true ) then&lt;br /&gt;
                                 s = f( s, i, f )&lt;br /&gt;
                             end&lt;br /&gt;
                         end&lt;br /&gt;
                     end&lt;br /&gt;
                     return s&lt;br /&gt;
                 end    -- free()&lt;br /&gt;
    if s:sub( 1, 1 ) == '{' then&lt;br /&gt;
        s    = s:gsub( string.char( 13, 10 ),  JSONutil.Encoder.sep )&lt;br /&gt;
                :gsub( string.char( 13 ),  JSONutil.Encoder.sep )&lt;br /&gt;
        stub = s:gsub( JSONutil.Encoder.sep, &amp;quot;&amp;quot; )&lt;br /&gt;
                :gsub( JSONutil.Encoder.stab, &amp;quot;&amp;quot; )&lt;br /&gt;
        scan = string.char( 0x5B, 0x01, 0x2D, 0x1F, 0x5D )    -- [ \-\ ]&lt;br /&gt;
        j    = stub:find( scan )&lt;br /&gt;
        if j then&lt;br /&gt;
            r = &amp;quot;ControlChar&amp;quot;&lt;br /&gt;
            s = mw.text.trim( s:sub( j + 1 ) )&lt;br /&gt;
            s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
        else&lt;br /&gt;
            i    = true&lt;br /&gt;
            j    = 1&lt;br /&gt;
            last = ( stub:sub( -1 ) == &amp;quot;}&amp;quot; )&lt;br /&gt;
            sep0 = string.char( 0x5B, 0x22, 0x27, 0x5D )    -- [ &amp;quot; ' ]&lt;br /&gt;
            sep1 = string.char( 0x5B, 0x5C, 0x22, 0x5D )    -- [ \ &amp;quot; ]&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;Bracket0&amp;quot;&lt;br /&gt;
        s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
    end&lt;br /&gt;
    while i do&lt;br /&gt;
        i, s = pcall( free, s, j, free )&lt;br /&gt;
        if i then&lt;br /&gt;
            i = s:find( sep0, j )&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;CommentEnd&amp;quot;&lt;br /&gt;
            s = mw.text.trim( s )&lt;br /&gt;
            s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
        end&lt;br /&gt;
        if i then&lt;br /&gt;
            if j == 1 then&lt;br /&gt;
                framework( s:sub( 1, i - 1 ) )&lt;br /&gt;
            end&lt;br /&gt;
            if s:sub( i, i ) == '&amp;quot;' then&lt;br /&gt;
                stub = s:sub( j,  i - 1 )&lt;br /&gt;
                if stub:find( '[^&amp;quot;]*,%s*[%]}]' ) then&lt;br /&gt;
                    r = &amp;quot;CommaEnd&amp;quot;&lt;br /&gt;
                    s = mw.text.trim( stub )&lt;br /&gt;
                    s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
                    i = false&lt;br /&gt;
                    j = false&lt;br /&gt;
                else&lt;br /&gt;
                    if j &amp;gt; 1 then&lt;br /&gt;
                        framework( stub )&lt;br /&gt;
                    end&lt;br /&gt;
                    i = i + 1&lt;br /&gt;
                    j = i&lt;br /&gt;
                end&lt;br /&gt;
                while j do&lt;br /&gt;
                    j = s:find( sep1, j )&lt;br /&gt;
                    if j then&lt;br /&gt;
                        if s:sub( j, j ) == '&amp;quot;' then&lt;br /&gt;
                            start  = s:sub( 1,  i - 1 )&lt;br /&gt;
                            suffix = s:sub( j )&lt;br /&gt;
                            if j &amp;gt; i then&lt;br /&gt;
                                stub = s:sub( i,  j - 1 )&lt;br /&gt;
                                        :gsub( JSONutil.Encoder.sep,&lt;br /&gt;
                                               &amp;quot;\\n&amp;quot; )&lt;br /&gt;
                                        :gsub( JSONutil.Encoder.stab,&lt;br /&gt;
                                               &amp;quot;\\t&amp;quot; )&lt;br /&gt;
                                j = i + stub:len()&lt;br /&gt;
                                s = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                                                   start, stub, suffix )&lt;br /&gt;
                            else&lt;br /&gt;
                                s = start .. suffix&lt;br /&gt;
                            end&lt;br /&gt;
                            j = j + 1&lt;br /&gt;
                            break   -- while j&lt;br /&gt;
                        else&lt;br /&gt;
                            j = j + 2&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        r = &amp;quot;QouteEnd&amp;quot;&lt;br /&gt;
                        s = mw.text.trim( s:sub( i ) )&lt;br /&gt;
                        s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
                        i = false&lt;br /&gt;
                    end&lt;br /&gt;
                end   -- while j&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;Qoute&amp;quot;&lt;br /&gt;
                s = mw.text.trim( s:sub( i ) )&lt;br /&gt;
                s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
                i = false&lt;br /&gt;
            end&lt;br /&gt;
        elseif not r then&lt;br /&gt;
            stub = s:sub( j )&lt;br /&gt;
            if stub:find( '[^&amp;quot;]*,%s*[%]}]' ) then&lt;br /&gt;
                r = &amp;quot;CommaEnd&amp;quot;&lt;br /&gt;
                s = mw.text.trim( stub )&lt;br /&gt;
                s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
            else&lt;br /&gt;
                framework( stub )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end   -- while i&lt;br /&gt;
    if not r   and   ( m ~= 0  or  n ~= 0 ) then&lt;br /&gt;
        if m ~= 0 then&lt;br /&gt;
            s = &amp;quot;}&amp;quot;&lt;br /&gt;
            if m &amp;gt; 0 then&lt;br /&gt;
                r = &amp;quot;BracketCloseLack&amp;quot;&lt;br /&gt;
                j = m&lt;br /&gt;
            elseif m &amp;lt; 0 then&lt;br /&gt;
                r = &amp;quot;BracketClosePlus&amp;quot;&lt;br /&gt;
                j = -m&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            s = &amp;quot;]&amp;quot;&lt;br /&gt;
            if n &amp;gt; 0 then&lt;br /&gt;
                r = &amp;quot;BracketCloseLack&amp;quot;&lt;br /&gt;
                j = n&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;BracketClosePlus&amp;quot;&lt;br /&gt;
                j = -n&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if j &amp;gt; 1 then&lt;br /&gt;
            s =  string.format( &amp;quot;%d %s&amp;quot;, j, s )&lt;br /&gt;
        end&lt;br /&gt;
    elseif not ( r or last ) then&lt;br /&gt;
        stub = suffix or apply or &amp;quot;&amp;quot;&lt;br /&gt;
        j    = stub:find( &amp;quot;/&amp;quot;, 1, true )&lt;br /&gt;
        if j then&lt;br /&gt;
            i, stub = pcall( free, stub, j, free )&lt;br /&gt;
        else&lt;br /&gt;
            i = true&lt;br /&gt;
        end&lt;br /&gt;
        stub = mw.text.trim( stub )&lt;br /&gt;
        if i then&lt;br /&gt;
            if stub:sub( - 1 ) ~= &amp;quot;}&amp;quot; then&lt;br /&gt;
                r = &amp;quot;Trailing&amp;quot;&lt;br /&gt;
                s = stub:match( &amp;quot;%}%s*(%S[^%}]*)$&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                    s = mw.ustring.sub( s, 1, JSONutil.more )&lt;br /&gt;
                else&lt;br /&gt;
                    s = mw.ustring.sub( stub,  - JSONutil.more )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;CommentEnd&amp;quot;&lt;br /&gt;
            s = mw.ustring.sub( stub, 1, JSONutil.more )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if r and s then&lt;br /&gt;
        s = s:gsub( JSONutil.Encoder.sep,  &amp;quot; &amp;quot; )&lt;br /&gt;
        s = mw.text.encode( s ):gsub( &amp;quot;|&amp;quot;, &amp;quot;&amp;amp;#124;&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r, s&lt;br /&gt;
end -- JSONutil.fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.fault = function ( alert, add, adapt )&lt;br /&gt;
    -- Retrieve formatted message&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     alert  -- string, with error keyword, or other text&lt;br /&gt;
    --     add    -- string|nil|false, with context&lt;br /&gt;
    --     adapt  -- function|string|table|nil|false, for I18N&lt;br /&gt;
    -- Returns string, with HTML span&lt;br /&gt;
    local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                     :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
    local s = alert&lt;br /&gt;
    if type( s ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        s = mw.text.trim( s )&lt;br /&gt;
        if s == &amp;quot;&amp;quot; then&lt;br /&gt;
            s = &amp;quot;EMPTY JSONutil.fault key&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if not s:find( &amp;quot; &amp;quot;, 1, true ) then&lt;br /&gt;
            local storage = string.format( &amp;quot;I18n/Module:%s.tab&amp;quot;,&lt;br /&gt;
                                           JSONutil.suite )&lt;br /&gt;
            local lucky, t = pcall( mw.ext.data.get, storage, &amp;quot;_&amp;quot; )&lt;br /&gt;
            if type( t ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                t = t.data&lt;br /&gt;
                if type( t ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    local e&lt;br /&gt;
                    s = &amp;quot;err_&amp;quot; .. s&lt;br /&gt;
                    for i = 1, #t do&lt;br /&gt;
                        e = t[ i ]&lt;br /&gt;
                        if type( e ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                            if e[ 1 ] == s then&lt;br /&gt;
                                e = e[ 2 ]&lt;br /&gt;
                                if type( e ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                                    local q = type( adapt )&lt;br /&gt;
                                    if q == &amp;quot;function&amp;quot; then&lt;br /&gt;
                                        s = adapt( e, s )&lt;br /&gt;
                                        t = false&lt;br /&gt;
                                    elseif q == &amp;quot;string&amp;quot; then&lt;br /&gt;
                                        t = mw.text.split( adapt, &amp;quot;%s+&amp;quot; )&lt;br /&gt;
                                    elseif q == &amp;quot;table&amp;quot; then&lt;br /&gt;
                                        t = adapt&lt;br /&gt;
                                    else&lt;br /&gt;
                                        t = { }&lt;br /&gt;
                                    end&lt;br /&gt;
                                    if t then&lt;br /&gt;
                                        table.insert( t, Fallback() )&lt;br /&gt;
                                        table.insert( t, &amp;quot;en&amp;quot; )&lt;br /&gt;
                                        for k = 1, #t do&lt;br /&gt;
                                            q = e[ t[ k ] ]&lt;br /&gt;
                                            if type( q ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                                                s = q&lt;br /&gt;
                                                break   -- for k&lt;br /&gt;
                                            end&lt;br /&gt;
                                        end   -- for k&lt;br /&gt;
                                    end&lt;br /&gt;
                                else&lt;br /&gt;
                                    s = &amp;quot;JSONutil.fault I18N bad #&amp;quot; ..&lt;br /&gt;
                                        tostring( i )&lt;br /&gt;
                                end&lt;br /&gt;
                                break   -- for i&lt;br /&gt;
                            end&lt;br /&gt;
                        else&lt;br /&gt;
                            break   -- for i&lt;br /&gt;
                        end&lt;br /&gt;
                    end   -- for i&lt;br /&gt;
                else&lt;br /&gt;
                    s = &amp;quot;INVALID JSONutil.fault I18N corrupted&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                s = &amp;quot;INVALID JSONutil.fault commons:Data: &amp;quot; .. type( t )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        s = &amp;quot;INVALID JSONutil.fault key: &amp;quot; .. tostring( s )&lt;br /&gt;
    end&lt;br /&gt;
    if type( add ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        s = string.format( &amp;quot;%s &amp;amp;#8211; %s&amp;quot;, s, add )&lt;br /&gt;
    end&lt;br /&gt;
    e:wikitext( s )&lt;br /&gt;
    return tostring( e )&lt;br /&gt;
end -- JSONutil.fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
JSONutil.fetch = function ( apply, always, adapt )&lt;br /&gt;
    -- Retrieve JSON data, or error message&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply   -- string, with presumable JSON text&lt;br /&gt;
    --     always  -- true, if apply is expected to need preprocessing&lt;br /&gt;
    --     adapt   -- function|string|table|nil|false, for I18N&lt;br /&gt;
    -- Returns table, with data, or string, with error as HTML span&lt;br /&gt;
    local lucky, r&lt;br /&gt;
    if not always then&lt;br /&gt;
        lucky, r = pcall( mw.text.jsonDecode, apply )&lt;br /&gt;
    end&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        lucky, r = JSONutil.fair( apply )&lt;br /&gt;
        if lucky then&lt;br /&gt;
            r = JSONutil.fault( lucky, r, adapt )&lt;br /&gt;
        else&lt;br /&gt;
            lucky, r = pcall( mw.text.jsonDecode, r )&lt;br /&gt;
            if not lucky then&lt;br /&gt;
                r = JSONutil.fault( r, false, adapt )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- JSONutil.fetch()&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&lt;br /&gt;
    --                         or &amp;quot;wikidata&amp;quot; or &amp;quot;~&amp;quot; or &amp;quot;@&amp;quot; or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-17&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local last    = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked  = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link    = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  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 suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if link then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&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;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&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;
    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.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;
&lt;br /&gt;
p.encodeArray = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.Array( frame:getParent().args,&lt;br /&gt;
                                   frame.args.type,&lt;br /&gt;
                                   frame.args.error == &amp;quot;1&amp;quot; )&lt;br /&gt;
end -- p.encodeArray&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.encodeComponent = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.Component( frame.args.sign,&lt;br /&gt;
                                       frame.args.value,&lt;br /&gt;
                                       frame.args.type,&lt;br /&gt;
                                       flip( frame ),&lt;br /&gt;
                                       frame.args.error == &amp;quot;1&amp;quot; )&lt;br /&gt;
end -- p.encodeComponent&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.encodeHash = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.Hash( frame:getParent().args,&lt;br /&gt;
                                  frame.args )&lt;br /&gt;
end -- p.encodeHash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.encodeI18N = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.I18N( frame:getParent().args,&lt;br /&gt;
                                  flip( frame ) )&lt;br /&gt;
end -- p.encodeI18N&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.encodeObject = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.object( flat( frame.args[ 1 ] ),&lt;br /&gt;
                                    flip( frame ) )&lt;br /&gt;
end -- p.encodeObject&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.encodePolyglott = function ( frame )&lt;br /&gt;
    return JSONutil.Encoder.Polyglott( flat( frame.args[ 1 ] ),&lt;br /&gt;
                                       flip( frame ) )&lt;br /&gt;
end -- p.encodePolyglott&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.JSONutil = function ()&lt;br /&gt;
    -- Module interface&lt;br /&gt;
    return JSONutil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:DateTime/local&amp;diff=382</id>
		<title>Modul:DateTime/local</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:DateTime/local&amp;diff=382"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local Serial = &amp;quot;2020-08-08&amp;quot;&lt;br /&gt;
--[=[&lt;br /&gt;
Date and time utilities: Localization  Deutsch&lt;br /&gt;
mw.loadData() table&lt;br /&gt;
]=]&lt;br /&gt;
local Similar   = mw.ustring.char( 8776 )    -- ~~&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { era         = { },&lt;br /&gt;
            monthsAbbr  = { },&lt;br /&gt;
            monthsLong  = { },&lt;br /&gt;
            monthsParse = { },&lt;br /&gt;
            months4     = { },&lt;br /&gt;
            sortWeights = { },&lt;br /&gt;
            templates   = { },&lt;br /&gt;
            zones       = { },&lt;br /&gt;
            failsafe    = Serial&lt;br /&gt;
          }&lt;br /&gt;
p.slang  = &amp;quot;de&amp;quot;&lt;br /&gt;
p.era.de = { &amp;quot;v.&amp;amp;#8239;Chr.&amp;quot;, &amp;quot;n.&amp;amp;#8239;Chr.&amp;quot; }&lt;br /&gt;
p.monthsAbbr.de = { n      = 3,&lt;br /&gt;
                    suffix = &amp;quot;.&amp;quot;,&lt;br /&gt;
                    [ 3 ]  = { &amp;quot;Mär&amp;quot;, &amp;quot;Mrz&amp;quot; } }&lt;br /&gt;
p.monthsAbbr[ &amp;quot;de-at&amp;quot; ] = { n      = 3,&lt;br /&gt;
                            suffix = &amp;quot;.&amp;quot;,&lt;br /&gt;
                            [ 1 ]  = { &amp;quot;Jan&amp;quot;, &amp;quot;Jän&amp;quot; },&lt;br /&gt;
                            [ 3 ]  = { &amp;quot;Mär&amp;quot;, &amp;quot;Mrz&amp;quot; } }&lt;br /&gt;
p.monthsParse.de = {&lt;br /&gt;
    [ &amp;quot;Dez&amp;quot; ]         = 12,&lt;br /&gt;
    [ &amp;quot;Feber&amp;quot; ]       =  2,&lt;br /&gt;
    [ &amp;quot;Jänner&amp;quot; ]      =  1,&lt;br /&gt;
    [ &amp;quot;J&amp;amp;auml;nner&amp;quot; ] =  1,&lt;br /&gt;
    [ &amp;quot;J&amp;amp;auml;n&amp;quot; ]    =  1,&lt;br /&gt;
    [ &amp;quot;M&amp;amp;auml;rz&amp;quot; ]   =  3,&lt;br /&gt;
    [ &amp;quot;Mrz&amp;quot; ]         =  3,&lt;br /&gt;
    [ &amp;quot;Mär&amp;quot; ]         =  3,&lt;br /&gt;
    [ &amp;quot;Okt&amp;quot; ]         = 10&lt;br /&gt;
}&lt;br /&gt;
p.monthsLong.de = {&lt;br /&gt;
    &amp;quot;Januar&amp;quot;,&lt;br /&gt;
    &amp;quot;Februar&amp;quot;,&lt;br /&gt;
    &amp;quot;März&amp;quot;,&lt;br /&gt;
    &amp;quot;April&amp;quot;,&lt;br /&gt;
    &amp;quot;Mai&amp;quot;,&lt;br /&gt;
    &amp;quot;Juni&amp;quot;,&lt;br /&gt;
    &amp;quot;Juli&amp;quot;,&lt;br /&gt;
    &amp;quot;August&amp;quot;,&lt;br /&gt;
    &amp;quot;September&amp;quot;,&lt;br /&gt;
    &amp;quot;Oktober&amp;quot;,&lt;br /&gt;
    &amp;quot;November&amp;quot;,&lt;br /&gt;
    &amp;quot;Dezember&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
p.monthsLong[ &amp;quot;de-at&amp;quot; ] = {&lt;br /&gt;
    [ 1 ] = &amp;quot;Jänner&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
p.months4.de = { [ 3 ] = true,&lt;br /&gt;
                 [ 6 ] = true,&lt;br /&gt;
                 [ 7 ] = true }&lt;br /&gt;
p.present = { date = &amp;quot;j. F Y&amp;quot;,&lt;br /&gt;
              time = &amp;quot;H:i:s&amp;quot;,&lt;br /&gt;
              both = &amp;quot;$date $time&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
p.sortWeights.de = {&lt;br /&gt;
    [true]         = Similar .. &amp;quot;abecnuvsz&amp;quot;,&lt;br /&gt;
    [&amp;quot;vor dem&amp;quot;]    = 3,&lt;br /&gt;
    [&amp;quot;vor etwa&amp;quot;]   = 3,&lt;br /&gt;
    [&amp;quot;vor&amp;quot;]        = 3,&lt;br /&gt;
    [&amp;quot;Anfang&amp;quot;]     = 4,&lt;br /&gt;
    [&amp;quot;frühestens&amp;quot;] = 5,&lt;br /&gt;
    [&amp;quot;ab dem&amp;quot;]     = 6,&lt;br /&gt;
    [&amp;quot;ab etwa&amp;quot;]    = 6,&lt;br /&gt;
    [&amp;quot;ab&amp;quot;]         = 6,&lt;br /&gt;
    [&amp;quot;seit dem&amp;quot;]   = 6,&lt;br /&gt;
    [&amp;quot;seit etwa&amp;quot;]  = 6,&lt;br /&gt;
    [&amp;quot;seit&amp;quot;]       = 6,&lt;br /&gt;
    [&amp;quot;vom&amp;quot;]        = 6,&lt;br /&gt;
    [&amp;quot;von&amp;quot;]        = 6,&lt;br /&gt;
    [&amp;quot;zwischen&amp;quot;]   = 6,&lt;br /&gt;
    [&amp;quot;bis zum&amp;quot;]    = 7,&lt;br /&gt;
    [&amp;quot;bis etwa&amp;quot;]   = 7,&lt;br /&gt;
    [&amp;quot;bis um&amp;quot;]     = 7,&lt;br /&gt;
    [&amp;quot;bis&amp;quot;]        = 7,&lt;br /&gt;
    [&amp;quot;spätestens&amp;quot;] = 8,&lt;br /&gt;
    [&amp;quot;Ende&amp;quot;]       = 8,&lt;br /&gt;
    [&amp;quot;nach dem&amp;quot;]   = 9,&lt;br /&gt;
    [&amp;quot;nach etwa&amp;quot;]  = 9,&lt;br /&gt;
    [&amp;quot;nach&amp;quot;]       = 9,&lt;br /&gt;
    [&amp;quot;ca.&amp;quot;]        = true,&lt;br /&gt;
    [&amp;quot;etwa&amp;quot;]       = true,&lt;br /&gt;
    [&amp;quot;um&amp;quot;]         = true,&lt;br /&gt;
    [Similar]      = true&lt;br /&gt;
}&lt;br /&gt;
p.templates = {&lt;br /&gt;
    [ &amp;quot;default&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;H:i, j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;$dmy&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;H:i, j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;$dmyt&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y, H:i&amp;quot;,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;$dmyts&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y, H:i:s&amp;quot;,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;data-sort-type:date&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j. M Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;dewiki&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;H:i, j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            lift = true,&lt;br /&gt;
            long = true }&lt;br /&gt;
}&lt;br /&gt;
p.templates.de  = {&lt;br /&gt;
    [ &amp;quot;T._Monat JJJJ hh:mm:ss Zone&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;F Y&amp;quot;,&lt;br /&gt;
            lift = true,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;T._Mon JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;T._Mon4 JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;T._Mon4_JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M&amp;amp;#160;Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;T._Mon4 JJJJ hh:mm&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            lift = true },&lt;br /&gt;
    [ &amp;quot;T._Mon4 JJJJ hh:mm:ss&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            lift = true },&lt;br /&gt;
    [ &amp;quot;T._Mon4_JJJJ hh:mm:ss&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M&amp;amp;#160;Y&amp;quot;,&lt;br /&gt;
            lift = true },&lt;br /&gt;
    [ &amp;quot;T._Mon4_JJJJ_hh:mm:ss&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M&amp;amp;#160;Y&amp;quot;,&lt;br /&gt;
            lift = true },&lt;br /&gt;
    [ &amp;quot;T._Mon4 JJJJ hh:mm:ss Zone&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
            lift = true,&lt;br /&gt;
            long = true },&lt;br /&gt;
    [ &amp;quot;T._Monat JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;F Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;T._Monat_JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.&amp;amp;#160;F&amp;amp;#160;Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;TT.MM.JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;d.m.Y&amp;quot; },&lt;br /&gt;
    [ &amp;quot;T.M.JJJJ&amp;quot; ] =&lt;br /&gt;
          { spec = &amp;quot;j.n.Y&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
p.zones.de = {&lt;br /&gt;
    MEZ  =   100,&lt;br /&gt;
    MESZ =   200&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Modul:DateTime&amp;diff=380</id>
		<title>Modul:DateTime</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Modul:DateTime&amp;diff=380"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local DateTime   = { serial = &amp;quot;2020-09-30&amp;quot;,&lt;br /&gt;
                     suite  = &amp;quot;DateTime&amp;quot;,&lt;br /&gt;
                     item   = 20652535 }&lt;br /&gt;
-- Date and time objects&lt;br /&gt;
local Failsafe   = DateTime&lt;br /&gt;
local GlobalMod  = DateTime&lt;br /&gt;
local Calc       = { }&lt;br /&gt;
local Meta       = { }&lt;br /&gt;
local Parser     = { }&lt;br /&gt;
local Private    = { }&lt;br /&gt;
local Prototypes = { }&lt;br /&gt;
local Templates  = { }&lt;br /&gt;
local World      = { slang       = &amp;quot;en&amp;quot;,&lt;br /&gt;
                     monthsLong  = { },&lt;br /&gt;
                     monthsParse = { },&lt;br /&gt;
                     months4     = { } }&lt;br /&gt;
local MaxYear    = 2099&lt;br /&gt;
local Frame&lt;br /&gt;
DateTime.char = { nbsp = mw.ustring.char( 160 ),&lt;br /&gt;
                  tab  = mw.ustring.char( 9 ) }&lt;br /&gt;
World.era = { en = { &amp;quot;BC&amp;quot;, &amp;quot;AD&amp;quot; } }&lt;br /&gt;
World.monthsAbbr = {  en = { n = 3 }  }&lt;br /&gt;
World.monthsLong.en = { &amp;quot;January&amp;quot;,&lt;br /&gt;
                        &amp;quot;February&amp;quot;,&lt;br /&gt;
                        &amp;quot;March&amp;quot;,&lt;br /&gt;
                        &amp;quot;April&amp;quot;,&lt;br /&gt;
                        &amp;quot;May&amp;quot;,&lt;br /&gt;
                        &amp;quot;June&amp;quot;,&lt;br /&gt;
                        &amp;quot;July&amp;quot;,&lt;br /&gt;
                        &amp;quot;August&amp;quot;,&lt;br /&gt;
                        &amp;quot;September&amp;quot;,&lt;br /&gt;
                        &amp;quot;October&amp;quot;,&lt;br /&gt;
                        &amp;quot;November&amp;quot;,&lt;br /&gt;
                        &amp;quot;December&amp;quot;&lt;br /&gt;
                      }&lt;br /&gt;
World.monthsParse.en = { [ &amp;quot;Apr&amp;quot; ] =  4,&lt;br /&gt;
                         [ &amp;quot;Aug&amp;quot; ] =  8,&lt;br /&gt;
                         [ &amp;quot;Dec&amp;quot; ] = 12,&lt;br /&gt;
                         [ &amp;quot;Feb&amp;quot; ] =  2,&lt;br /&gt;
                         [ &amp;quot;Jan&amp;quot; ] =  1,&lt;br /&gt;
                         [ &amp;quot;Jul&amp;quot; ] =  7,&lt;br /&gt;
                         [ &amp;quot;Jun&amp;quot; ] =  6,&lt;br /&gt;
                         [ &amp;quot;Mar&amp;quot; ] =  3,&lt;br /&gt;
                         [ &amp;quot;May&amp;quot; ] =  5,&lt;br /&gt;
                         [ &amp;quot;Nov&amp;quot; ] = 11,&lt;br /&gt;
                         [ &amp;quot;Oct&amp;quot; ] = 10,&lt;br /&gt;
                         [ &amp;quot;Sep&amp;quot; ] =  9&lt;br /&gt;
                       }&lt;br /&gt;
World.months4.en = { [ 6 ] = true,&lt;br /&gt;
                     [ 7 ] = true }&lt;br /&gt;
World.templates = { [ &amp;quot;ISO&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;Y-m-d&amp;quot;,&lt;br /&gt;
                          lift = true },&lt;br /&gt;
                    [ &amp;quot;ISO-T&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;c&amp;quot; },&lt;br /&gt;
                    [ &amp;quot;timestamp&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;YmdHis&amp;quot; },&lt;br /&gt;
                    [ &amp;quot;default&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;H:i, j&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
                          long = true },&lt;br /&gt;
                    [ &amp;quot;$dmy&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;H:i, j&amp;amp;#160;M Y&amp;quot;,&lt;br /&gt;
                          long = true },&lt;br /&gt;
                    [ &amp;quot;$ymd&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;H:i, Y M&amp;amp;#160;j&amp;quot;,&lt;br /&gt;
                          long = true  },&lt;br /&gt;
                    [ &amp;quot;$dmyt&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;j&amp;amp;#160;M Y, H:i&amp;quot;,&lt;br /&gt;
                          long = true  },&lt;br /&gt;
                    [ &amp;quot;$dmyts&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;j&amp;amp;#160;M Y, H:i:s&amp;quot;,&lt;br /&gt;
                          long = true  },&lt;br /&gt;
                    [ &amp;quot;data-sort-type:date&amp;quot; ] =&lt;br /&gt;
                        { spec = &amp;quot;j M Y&amp;quot; }&lt;br /&gt;
                  }&lt;br /&gt;
World.templates.en = { }&lt;br /&gt;
World.zones = {&lt;br /&gt;
    [ &amp;quot;!&amp;quot; ] = &amp;quot;YXWVUTSRQPONZABCDEFGHIKLM&amp;quot;,&lt;br /&gt;
    UTC  =   0,&lt;br /&gt;
    GMT  =   0       -- Greenwich Mean Time&lt;br /&gt;
}&lt;br /&gt;
World.zones.en = {&lt;br /&gt;
    BST  =   100,    -- British Summer Time&lt;br /&gt;
    IST  =   100,    -- Irish Summer Time&lt;br /&gt;
    WET  =   0,      -- Western Europe Time&lt;br /&gt;
    WEST =   100,    -- Western Europe Summer Time&lt;br /&gt;
    CET  =   100,    -- Central Europe Time&lt;br /&gt;
    CEST =   200,    -- Central Europe Summer Time&lt;br /&gt;
    EET  =   200,    -- Eastern Europe Time&lt;br /&gt;
    EEST =   300,    -- Eastern Europe Summer Time&lt;br /&gt;
    MSK  =   300,    -- Moscow Time&lt;br /&gt;
    MSD  =   400,    -- Moscow Summer Time&lt;br /&gt;
    NST  =  -330,    -- Newfoundland Standard Time&lt;br /&gt;
    NDT  =  -230,    -- Newfoundland Daylight Time&lt;br /&gt;
    AST  =  -400,    -- Atlantic Standard Time&lt;br /&gt;
    ADT  =  -300,    -- Atlantic Daylight Time&lt;br /&gt;
    EST  =  -500,    -- Eastern Standard Time&lt;br /&gt;
    EDT  =  -400,    -- Eastern Daylight Saving Time&lt;br /&gt;
    CST  =  -600,    -- Central Standard Time&lt;br /&gt;
    CDT  =  -500,    -- Central Daylight Saving Time&lt;br /&gt;
    MST  =  -700,    -- Mountain Standard Time&lt;br /&gt;
    MDT  =  -600,    -- Mountain Daylight Saving Time&lt;br /&gt;
    PST  =  -800,    -- Pacific Standard Time&lt;br /&gt;
    PDT  =  -700,    -- Pacific Daylight Saving Time&lt;br /&gt;
    AKST =  -900,    -- Alaska Standard Time&lt;br /&gt;
    AKDT =  -800,    -- Alaska Standard Daylight Saving Time&lt;br /&gt;
    HST  = -1000     -- Hawaiian Standard Time&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 fun, lucky, r&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;
    if append then&lt;br /&gt;
        storage = string.format( &amp;quot;%s/%s&amp;quot;, storage, append )&lt;br /&gt;
    end&lt;br /&gt;
    lucky, r = pcall( fun,  &amp;quot;Module:&amp;quot; .. storage )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        local suited&lt;br /&gt;
        GlobalMod.globalModules = GlobalMod.globalModules or { }&lt;br /&gt;
        suited = GlobalMod.globalModules[ access ]&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;
            if append then&lt;br /&gt;
                storage = string.format( &amp;quot;%s/%s&amp;quot;, storage, append )&lt;br /&gt;
            end&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 capitalize( a )&lt;br /&gt;
    -- Upcase first character, downcase anything else&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     a  -- string&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    return  mw.ustring.upper( mw.ustring.sub( a, 1, 1 ) )&lt;br /&gt;
            .. mw.ustring.lower( mw.ustring.sub( a, 2 ) )&lt;br /&gt;
end -- capitalize()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fault( a )&lt;br /&gt;
    -- Format error message by class=error&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     a  -- string, error message&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, HTML span&lt;br /&gt;
    local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                     :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                     :wikitext( a )&lt;br /&gt;
    return tostring( e )&lt;br /&gt;
end -- fault()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function frame()&lt;br /&gt;
    if not Frame then&lt;br /&gt;
        Frame = mw.getCurrentFrame()&lt;br /&gt;
    end&lt;br /&gt;
    return Frame&lt;br /&gt;
end -- frame()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Meta.localized  = false&lt;br /&gt;
Meta.serial     = DateTime.serial&lt;br /&gt;
Meta.signature  = &amp;quot;__datetime&amp;quot;&lt;br /&gt;
Meta.suite      = &amp;quot;{DateTime}&amp;quot;&lt;br /&gt;
Meta.components = { lang  = &amp;quot;string&amp;quot;,&lt;br /&gt;
                    bc    = &amp;quot;boolean&amp;quot;,&lt;br /&gt;
                    year  = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    month = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    week  = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    dom   = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    hour  = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    min   = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    sec   = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    msec  = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    mysec = &amp;quot;number&amp;quot;,&lt;br /&gt;
                    zone  = false,&lt;br /&gt;
                    leap  = &amp;quot;boolean&amp;quot;,&lt;br /&gt;
                    jul   = &amp;quot;boolean&amp;quot; }&lt;br /&gt;
Meta.order      = { &amp;quot;bc&amp;quot;, &amp;quot;year&amp;quot;, &amp;quot;month&amp;quot;, &amp;quot;week&amp;quot;, &amp;quot;dom&amp;quot;,&lt;br /&gt;
                    &amp;quot;hour&amp;quot;, &amp;quot;min&amp;quot;, &amp;quot;sec&amp;quot;, &amp;quot;msec&amp;quot;, &amp;quot;mysec&amp;quot; }&lt;br /&gt;
Meta.tableI    = {    -- instance metatable&lt;br /&gt;
    __index    = function ( self, access )&lt;br /&gt;
                     local r = self[ Meta.signature ][ access ]&lt;br /&gt;
                     if r == nil then&lt;br /&gt;
                         if access == &amp;quot;serial&amp;quot; then&lt;br /&gt;
                             r = Meta.serial&lt;br /&gt;
                         elseif access == &amp;quot;suite&amp;quot; then&lt;br /&gt;
                             r = &amp;quot;DateTime&amp;quot;&lt;br /&gt;
                         else&lt;br /&gt;
                             r = Prototypes[ access ]&lt;br /&gt;
                         end&lt;br /&gt;
                     end&lt;br /&gt;
                     return r&lt;br /&gt;
                 end,&lt;br /&gt;
    __newindex = function ( self, access, assign )&lt;br /&gt;
                     if type( access ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                         local data = self[ Meta.signature ]&lt;br /&gt;
                         if assign == nil then&lt;br /&gt;
                             local val = data[ access ]&lt;br /&gt;
                             data[ access ] = nil&lt;br /&gt;
                             if not Prototypes.fair( data ) then&lt;br /&gt;
                                 data[ access ] = val&lt;br /&gt;
                             end&lt;br /&gt;
                         elseif Prototypes.fair( data,&lt;br /&gt;
                                                 access,&lt;br /&gt;
                                                 assign ) then&lt;br /&gt;
                             data[ access ] = assign&lt;br /&gt;
                         end&lt;br /&gt;
                     end&lt;br /&gt;
                     return&lt;br /&gt;
                 end,&lt;br /&gt;
    __add      = function ( op1, op2 )&lt;br /&gt;
                     return Prototypes.future( op1, op2, true )&lt;br /&gt;
                 end,&lt;br /&gt;
    __eq       = function ( op1, op2 )&lt;br /&gt;
                     return Prototypes.flow( op1, op2, &amp;quot;eq&amp;quot; )&lt;br /&gt;
                 end,&lt;br /&gt;
    __lt       = function ( op1, op2 )&lt;br /&gt;
                     return Prototypes.flow( op1, op2, &amp;quot;lt&amp;quot; )&lt;br /&gt;
                 end,&lt;br /&gt;
    __le       = function ( op1, op2 )&lt;br /&gt;
                     return Prototypes.flow( op1, op2, &amp;quot;le&amp;quot; )&lt;br /&gt;
                 end,&lt;br /&gt;
    __tostring = function ( e )&lt;br /&gt;
                     return Prototypes.tostring( e )&lt;br /&gt;
                 end,&lt;br /&gt;
    __call     = function ( func, ... )&lt;br /&gt;
                     return Meta.fiat( ... )&lt;br /&gt;
                 end&lt;br /&gt;
} -- Meta.tableI&lt;br /&gt;
Meta.tableL    = {    -- library metatable&lt;br /&gt;
    __index    = function ( self, access )&lt;br /&gt;
                     local r&lt;br /&gt;
                     if access == &amp;quot;serial&amp;quot; then&lt;br /&gt;
                         r = Meta.serial&lt;br /&gt;
                     elseif access == &amp;quot;suite&amp;quot; then&lt;br /&gt;
                         r = Meta.suite&lt;br /&gt;
                     end&lt;br /&gt;
                     return r&lt;br /&gt;
                 end,&lt;br /&gt;
    __newindex = function ()&lt;br /&gt;
                     return&lt;br /&gt;
                 end,&lt;br /&gt;
    __tostring = function ()&lt;br /&gt;
                     return Meta.suite&lt;br /&gt;
                 end,&lt;br /&gt;
    __call     = function ( func, ... )&lt;br /&gt;
                     return Meta.fiat( ... )&lt;br /&gt;
                 end&lt;br /&gt;
} -- Meta.tableL&lt;br /&gt;
Meta.fiat = function ( assign, alien, add )&lt;br /&gt;
    -- Create instance object (constructor)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assign  -- string, with initial timestamp, or nil&lt;br /&gt;
    --                nil    -- now&lt;br /&gt;
    --                false  -- empty object&lt;br /&gt;
    --                table  -- clone this object, or copy from raw&lt;br /&gt;
    --                          ignore remaining parameters&lt;br /&gt;
    --     alien   -- string, with language code, or nil&lt;br /&gt;
    --     add     -- string, with interval (PHP strtotime), or nil&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, as DateTime object&lt;br /&gt;
    --     string or false, if failed&lt;br /&gt;
    local r&lt;br /&gt;
    Private.foreign()&lt;br /&gt;
    if type( assign ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if assign.suite == Meta.suite  and&lt;br /&gt;
           getmetatable( assign ) == Meta.tableI then&lt;br /&gt;
            r = assign[ Meta.signature ]&lt;br /&gt;
        else&lt;br /&gt;
            r = Private.from( assign )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = Private.factory( assign, alien, add )&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = { [ Meta.signature ] = r }&lt;br /&gt;
        setmetatable( r, Meta.tableI )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Meta.fiat()&lt;br /&gt;
setmetatable( DateTime, Meta.tableL )&lt;br /&gt;
DateTime.serial   = nil&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Calc.months = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--  Calc.fast = function ( at )&lt;br /&gt;
--      -- Quick scan of full ISO stamp&lt;br /&gt;
--      -- Parameter:&lt;br /&gt;
--      --     apply  -- string, ISO&lt;br /&gt;
--      -- Returns:&lt;br /&gt;
--      --     table, with numeric components&lt;br /&gt;
--      local r = { }&lt;br /&gt;
--      r.year  = tonumber( at:sub(  1, 4 ) )&lt;br /&gt;
--      r.month = tonumber( at:sub(  6, 2 ) )&lt;br /&gt;
--      r.dom   = tonumber( at:sub(  9, 2 ) )&lt;br /&gt;
--      r.hour  = tonumber( at:sub( 12, 2 ) )&lt;br /&gt;
--      r.min   = tonumber( at:sub( 14, 2 ) )&lt;br /&gt;
--      r.sec   = tonumber( at:sub( 17, 2 ) )&lt;br /&gt;
--      if at:sub( 19, 1 ) == &amp;quot;.&amp;quot; then&lt;br /&gt;
--          r.msec = tonumber( at:sub( 20, 3 ) )&lt;br /&gt;
--          if #at &amp;gt; 22 then&lt;br /&gt;
--              r.mysec = tonumber( at:sub( 23, 3 ) )&lt;br /&gt;
--          end&lt;br /&gt;
--      end&lt;br /&gt;
--      return r&lt;br /&gt;
--  end -- Calc.fast()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Calc.fair = function ( adjust )&lt;br /&gt;
    -- Normalize numeric components&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- table, with raw numbers&lt;br /&gt;
    local ranges = { year  = { min = -999,&lt;br /&gt;
                               max = 9999 },&lt;br /&gt;
                     month = { min =  1,&lt;br /&gt;
                               max = 12,&lt;br /&gt;
                               mod = 12 },&lt;br /&gt;
                     dom   = { min =  1,&lt;br /&gt;
                               max = 28 },&lt;br /&gt;
                     hour  = { mod = 24 },&lt;br /&gt;
                     min   = { mod = 60 },&lt;br /&gt;
                     sec   = { mod = 60 },&lt;br /&gt;
                     msec  = { mod = 1000 },&lt;br /&gt;
                     mysec = { mod = 1000 } }&lt;br /&gt;
    local m, max, min, move, n, range, s&lt;br /&gt;
    for i = 10, 2, -1 do&lt;br /&gt;
        s = Meta.order[ i ]&lt;br /&gt;
        n = adjust[ s ]&lt;br /&gt;
        if n or move then&lt;br /&gt;
            range = ranges[ s ]&lt;br /&gt;
            if range then&lt;br /&gt;
                min = range.min or 0&lt;br /&gt;
                max = range.max  or  ( range.mod - 1 )&lt;br /&gt;
                if move then&lt;br /&gt;
                    n    = ( n or 0 )  +  move&lt;br /&gt;
                    move = false&lt;br /&gt;
                end&lt;br /&gt;
                if n &amp;lt; min  or  n &amp;gt; max then&lt;br /&gt;
                    if range.mod then&lt;br /&gt;
                        m    = n % range.mod&lt;br /&gt;
                        move = ( n - m )  /  range.mod&lt;br /&gt;
                        n    = min + m&lt;br /&gt;
                    else    -- dom&lt;br /&gt;
                        if adjust.month and adjust.year  and&lt;br /&gt;
                           adjust.month &amp;gt;= 1  and&lt;br /&gt;
                           adjust.month &amp;lt;= 12 and&lt;br /&gt;
                           adjust.year &amp;gt; 1900 then&lt;br /&gt;
                            if n &amp;gt; 0 then&lt;br /&gt;
                                max = Calc.final( adjust )&lt;br /&gt;
                                while n &amp;gt; max do&lt;br /&gt;
                                    n = n - max&lt;br /&gt;
                                    if adjust.month &amp;lt; 12 then&lt;br /&gt;
                                        adjust.month = adjust.month + 1&lt;br /&gt;
                                    else&lt;br /&gt;
                                        adjust.month = 1&lt;br /&gt;
                                        adjust.year  = adjust.year + 1&lt;br /&gt;
                                    end&lt;br /&gt;
                                    max = Calc.final( adjust )&lt;br /&gt;
                                end    -- while n &amp;lt;= max&lt;br /&gt;
                            else&lt;br /&gt;
                                while n &amp;lt; 1 do&lt;br /&gt;
                                    if adjust.month == 1 then&lt;br /&gt;
                                        adjust.month = 12&lt;br /&gt;
                                        adjust.year  = adjust.year - 1&lt;br /&gt;
                                    else&lt;br /&gt;
                                        adjust.month = adjust.month - 1&lt;br /&gt;
                                    end&lt;br /&gt;
                                    max = Calc.final( adjust )&lt;br /&gt;
                                    n   = n + max&lt;br /&gt;
                                end    -- while n &amp;lt; 1&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                adjust[ s ] = n&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for i&lt;br /&gt;
end -- Calc.fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Calc.final = function ( adjust )&lt;br /&gt;
    -- Retrieve number of days in particular month&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust   -- table, with date specification&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number, of days in month&lt;br /&gt;
    local r = Calc.months[ adjust.month ]&lt;br /&gt;
    if adjust.month == 2  and&lt;br /&gt;
       ( adjust.year % 4 ~= 0  or&lt;br /&gt;
         adjust.year % 400 == 0 ) then&lt;br /&gt;
        r = 28&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Calc.final()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Calc.future = function ( add )&lt;br /&gt;
    -- Parse move interval&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     add   -- string, with GNU relative items&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, with numeric components, or false&lt;br /&gt;
    local r, token&lt;br /&gt;
    local units = { year      = true,&lt;br /&gt;
                    month     = true,&lt;br /&gt;
                    fortnight = { slot = &amp;quot;dom&amp;quot;, mult = 14 },&lt;br /&gt;
                    week      = { slot = &amp;quot;dom&amp;quot;, mult = 7 },&lt;br /&gt;
                    dom       = true,&lt;br /&gt;
                    hour      = true,&lt;br /&gt;
                    min       = true,&lt;br /&gt;
                    sec       = true }&lt;br /&gt;
    local story = string.format( &amp;quot; %s &amp;quot;, add:lower() )&lt;br /&gt;
                        :gsub( &amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot; yesterday &amp;quot;, &amp;quot; -1 dom &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot; tomorrow &amp;quot;,   &amp;quot; 1 dom &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot;(%l)s &amp;quot;, &amp;quot;%1 &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot; day &amp;quot;,    &amp;quot; dom &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot; minute &amp;quot;, &amp;quot; min &amp;quot; )&lt;br /&gt;
                        :gsub( &amp;quot; second &amp;quot;, &amp;quot; sec &amp;quot; )&lt;br /&gt;
    local feed  = function ()&lt;br /&gt;
                      local slice&lt;br /&gt;
                      token, slice = story:match( &amp;quot;^( (%S+)) &amp;quot; )&lt;br /&gt;
                      return slice&lt;br /&gt;
                  end&lt;br /&gt;
    local fed   = function ()&lt;br /&gt;
                      story = story:sub( #token + 1 )&lt;br /&gt;
                  end&lt;br /&gt;
    local m, n, s, u&lt;br /&gt;
    while true do&lt;br /&gt;
        s = feed()&lt;br /&gt;
        if s then&lt;br /&gt;
            n = 1&lt;br /&gt;
            if s:match( &amp;quot;^[+-]?%d+$&amp;quot; ) then&lt;br /&gt;
                n = tonumber( s )&lt;br /&gt;
                fed()&lt;br /&gt;
                s = feed()&lt;br /&gt;
            end&lt;br /&gt;
            if s then&lt;br /&gt;
                u = units[ s ]&lt;br /&gt;
            end&lt;br /&gt;
            if s and u then&lt;br /&gt;
                fed()&lt;br /&gt;
                if u ~= true then&lt;br /&gt;
                    s = u.slot&lt;br /&gt;
                    n = n * u.mult&lt;br /&gt;
                end&lt;br /&gt;
                if feed() == &amp;quot;ago&amp;quot; then&lt;br /&gt;
                    if n &amp;gt; 0 then&lt;br /&gt;
                        n = - n&lt;br /&gt;
                    end&lt;br /&gt;
                    fed()&lt;br /&gt;
                end&lt;br /&gt;
                r      = r  or  { }&lt;br /&gt;
                r[ s ] = ( r[ s ] or 0 )  +  n&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
                break    -- while true&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            break    -- while true&lt;br /&gt;
        end&lt;br /&gt;
    end    -- while true&lt;br /&gt;
    return r&lt;br /&gt;
end -- Calc.future()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.digitsHeading = function ( analyse, alone, amount, add )&lt;br /&gt;
    -- String analysis, if digits only or at least 4 digits heading&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string to be scanned, starting with digit&lt;br /&gt;
    --                 digits only, else starting with exactly 4 digits&lt;br /&gt;
    --     alone    -- true, if only digits&lt;br /&gt;
    --     amount   -- number of heading digits&lt;br /&gt;
    --     add      -- table, to be extended&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    local r = add&lt;br /&gt;
    if alone then&lt;br /&gt;
        -- digits only&lt;br /&gt;
        if amount &amp;lt;= 4 then&lt;br /&gt;
            r.year = tonumber( analyse )&lt;br /&gt;
        elseif amount == 14 then&lt;br /&gt;
            -- timestamp&lt;br /&gt;
            r.year   = tonumber( analyse:sub(  1,  4 ) )&lt;br /&gt;
            r.month  = tonumber( analyse:sub(  5,  6 ) )&lt;br /&gt;
            r.dom    = tonumber( analyse:sub(  7,  8 ) )&lt;br /&gt;
            r.hour   = tonumber( analyse:sub(  9, 10 ) )&lt;br /&gt;
            r.min    = tonumber( analyse:sub( 11, 12 ) )&lt;br /&gt;
            r.sec    = tonumber( analyse:sub( 13, 14 ) )&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    elseif amount == 4 then&lt;br /&gt;
        local s, sep, sx = analyse:match( &amp;quot;^(%d+)([%-%.:Ww]?)(.*)$&amp;quot; )&lt;br /&gt;
        r.year = tonumber( s )&lt;br /&gt;
        if sep == &amp;quot;-&amp;quot; then&lt;br /&gt;
            -- ISO&lt;br /&gt;
            s, sep, sx = sx:match( &amp;quot;^(%d%d)(-?)(.*)$&amp;quot; )&lt;br /&gt;
            if s then&lt;br /&gt;
                r.month  = tonumber( s )&lt;br /&gt;
                r.month2 = true&lt;br /&gt;
                if sep == &amp;quot;-&amp;quot; then&lt;br /&gt;
                    s, sep, sx = sx:match( &amp;quot;^(%d%d?)([ T]?)(.*)$&amp;quot; )&lt;br /&gt;
                    if s then&lt;br /&gt;
                        r.dom = tonumber( s )&lt;br /&gt;
                        if sep == &amp;quot;T&amp;quot; then&lt;br /&gt;
                            r.month2 = nil&lt;br /&gt;
                        else&lt;br /&gt;
                            r.dom2 = ( #s == 2 )&lt;br /&gt;
                        end&lt;br /&gt;
                        if sep then&lt;br /&gt;
                            r = Parser.time( sx,  r,  sep == &amp;quot;T&amp;quot; )&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        r = false&lt;br /&gt;
                    end&lt;br /&gt;
                elseif sx and sx ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        elseif sep:lower() == &amp;quot;w&amp;quot; then&lt;br /&gt;
            if sx then&lt;br /&gt;
                s = sx:match( &amp;quot;^(%d%d?)$&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                    r.week = tonumber( s )&lt;br /&gt;
                    if r.week &amp;lt; 1  or  r.week &amp;gt; 53 then&lt;br /&gt;
                        r = false&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
        if r then&lt;br /&gt;
            r.iso = true&lt;br /&gt;
        end&lt;br /&gt;
    elseif amount == 8 then&lt;br /&gt;
        -- ISO compact&lt;br /&gt;
        local s, sz = analyse:match( &amp;quot;^%d+T(%d+)([.+-]?%d*%a*)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            local n = #s&lt;br /&gt;
            if n == 2  or  n == 4  or  n == 6 then&lt;br /&gt;
                r.year  = tonumber( analyse:sub(  1,  4 ) )&lt;br /&gt;
                r.month = tonumber( analyse:sub(  5,  6 ) )&lt;br /&gt;
                r.dom   = tonumber( analyse:sub(  7,  8 ) )&lt;br /&gt;
                r.hour  = tonumber( analyse:sub( 10, 11 ) )&lt;br /&gt;
                if n &amp;gt; 2 then&lt;br /&gt;
                    r.min = tonumber( s:sub( 3, 4 ) )&lt;br /&gt;
                    if n == 6 then&lt;br /&gt;
                        r.sec = tonumber( s:sub( 5, 6 ) )&lt;br /&gt;
                    end&lt;br /&gt;
                    n, s = sz:match( &amp;quot;^(%.%d+)([+-]?[%a%d]*)$&amp;quot; )&lt;br /&gt;
                    if n then&lt;br /&gt;
                        n      = n .. &amp;quot;00&amp;quot;&lt;br /&gt;
                        r.msec = tonumber( n:sub( 1, 3 ) )&lt;br /&gt;
                        if #n &amp;gt;= 6 then&lt;br /&gt;
                            r.mysec = tonumber( n:sub( 4, 6 ) )&lt;br /&gt;
                        end&lt;br /&gt;
                        sz = s&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if sz ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                    s, sz = sz:match( &amp;quot;^([+-]?)(%a*)$&amp;quot; )&lt;br /&gt;
                    if s == &amp;quot;&amp;quot; then&lt;br /&gt;
                        if sz:match( &amp;quot;^(%u)$&amp;quot; ) then&lt;br /&gt;
                            r.zone = sz&lt;br /&gt;
                        else&lt;br /&gt;
                            s = false&lt;br /&gt;
                        end&lt;br /&gt;
                    elseif #s == 1 then&lt;br /&gt;
                        r.zone = s .. sz&lt;br /&gt;
                    else&lt;br /&gt;
                        s = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                s = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if s then&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Parser.digitsHeading()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.eraGermanEnglish = function ( analyse )&lt;br /&gt;
    -- String analysis, for German and English era&lt;br /&gt;
    -- v. Chr.   v. u. Z.  n. Chr.   AD BC   A.D. B.C. B.C.E.&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1  -- table, with boolean era, if any&lt;br /&gt;
    --     2  -- string, with era stripped off, if any&lt;br /&gt;
    local rO = { }&lt;br /&gt;
    local rS = analyse&lt;br /&gt;
    local s, switch = analyse:match( &amp;quot;^(.+) ([vn])%. ?Chr%.$&amp;quot; )&lt;br /&gt;
    if switch then&lt;br /&gt;
        rS    = s&lt;br /&gt;
        rO.bc = ( switch == &amp;quot;v&amp;quot; )&lt;br /&gt;
    elseif analyse:find( &amp;quot; v%. ?u%. ?Z%.$&amp;quot; ) then&lt;br /&gt;
        rS    = analyse:match( &amp;quot;^(.+) v%. ?u%. ?Z%.$&amp;quot; )&lt;br /&gt;
        rO.bc = true&lt;br /&gt;
    elseif analyse:find( &amp;quot; B%.? ?C%.? ?E?%.?$&amp;quot; ) then&lt;br /&gt;
        rS    = analyse:match( &amp;quot;^(.+) B%.? ?C%.? ?E?%.?$&amp;quot; )&lt;br /&gt;
        rO.bc = true&lt;br /&gt;
    elseif analyse:find( &amp;quot;^A%.? ?D%.? &amp;quot; ) then&lt;br /&gt;
        rS    = analyse:match( &amp;quot;^A%.? ?D%.? (.*)$&amp;quot; )&lt;br /&gt;
        rO.bc = false&lt;br /&gt;
    end&lt;br /&gt;
    return rO, rS&lt;br /&gt;
end -- Parser.eraGermanEnglish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.european = function ( ahead, adhere, analyse, assign )&lt;br /&gt;
    -- String analysis, retrieve date style: DOM MONTH YEAR&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     ahead    -- string, with first digits, not more than 2&lt;br /&gt;
    --     adhere   -- string, with first separator; not &amp;quot;:&amp;quot;&lt;br /&gt;
    --     analyse  -- string, remainder following adhere&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended if parsed&lt;br /&gt;
    local r = assign&lt;br /&gt;
    local s, s2, sx&lt;br /&gt;
    if adhere == &amp;quot;.&amp;quot;  or  adhere == &amp;quot;. &amp;quot; then&lt;br /&gt;
        -- 23.12.2013&lt;br /&gt;
        -- 23. Dezember 2013&lt;br /&gt;
        s, sx = analyse:match( &amp;quot;^(%d%d?)%.(.*)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            r = Parser.putDate( false, s, ahead, assign )&lt;br /&gt;
            r = Parser.yearTime( sx, r )&lt;br /&gt;
        else&lt;br /&gt;
            s, sx = mw.ustring.match( analyse,&lt;br /&gt;
                                      &amp;quot;^ ?([%a&amp;amp;;]+%.?) ?(.*)$&amp;quot; )&lt;br /&gt;
            if s then&lt;br /&gt;
                local n = Parser.monthNumber( s )&lt;br /&gt;
                if n then&lt;br /&gt;
                    r.month = n&lt;br /&gt;
                    r.dom   = tonumber( ahead )&lt;br /&gt;
                    r.dom2  = ( #ahead == 2 )&lt;br /&gt;
                    r       = Parser.yearTime( sx, r )&lt;br /&gt;
                else&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif adhere == &amp;quot; &amp;quot; then&lt;br /&gt;
        -- 23 Dec 2013&lt;br /&gt;
        s, sx = mw.ustring.match( analyse,&lt;br /&gt;
                                  &amp;quot;^([%a&amp;amp;;]+%.?) ?(.*)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            local n = Parser.monthNumber( s )&lt;br /&gt;
            if n then&lt;br /&gt;
                r.month = n&lt;br /&gt;
                r.dom   = tonumber( ahead )&lt;br /&gt;
                r.dom2  = ( #ahead == 2 )&lt;br /&gt;
                r       = Parser.yearTime( sx, r )&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Parser.european()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.isoDate = function ( analyse, assign )&lt;br /&gt;
    -- String analysis, retrieve month heading ISO date&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string, with heading hyphen&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1  -- table, extended if parsed&lt;br /&gt;
    --     2  -- stripped string, or false, if invalid text format&lt;br /&gt;
    local rO, rS&lt;br /&gt;
    if analyse:match( &amp;quot;^%-%-?[0-9]&amp;quot; ) then&lt;br /&gt;
        local n, s&lt;br /&gt;
        rO = assign&lt;br /&gt;
        rS = analyse:sub( 2 )&lt;br /&gt;
        s  = rS:match( &amp;quot;^([012][0-9])%-&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            n = tonumber( s )&lt;br /&gt;
            if n &amp;gt;= 1  and  n &amp;lt;= 12 then&lt;br /&gt;
                rO.month = n&lt;br /&gt;
                rS       = rS:sub( 3 )&lt;br /&gt;
            else&lt;br /&gt;
                rO = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if rO then&lt;br /&gt;
            if rS:byte( 1, 1 ) == 45 then&lt;br /&gt;
                local suffix&lt;br /&gt;
                s = rS:match( &amp;quot;^%-([0-3][0-9])&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                    n  = tonumber( s )&lt;br /&gt;
                    if n &amp;gt;= 1  and  n &amp;lt;= 31 then&lt;br /&gt;
                        rO.dom = n&lt;br /&gt;
                        rS     = rS:sub( 4 )&lt;br /&gt;
                    else&lt;br /&gt;
                        rO = false&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    rS:sub( 2 )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                rO = false&lt;br /&gt;
            end&lt;br /&gt;
            if rO then&lt;br /&gt;
                if #rS &amp;gt; 0 then&lt;br /&gt;
                    if rO.dom then&lt;br /&gt;
                        n = rS:byte( 1, 1 )&lt;br /&gt;
                        if n == 32  or  n == 84 then&lt;br /&gt;
                            rS = rS:sub( 2 )&lt;br /&gt;
                        else&lt;br /&gt;
                            rO = false&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        rO = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        rO = false&lt;br /&gt;
    end&lt;br /&gt;
    if rO then&lt;br /&gt;
        rO.iso = true&lt;br /&gt;
    else&lt;br /&gt;
        rS = false&lt;br /&gt;
    end&lt;br /&gt;
    return rO, rS&lt;br /&gt;
end -- Parser.isoDate()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.monthHeading = function ( analyse, assign )&lt;br /&gt;
    -- String analysis, retrieve month heading date (US only)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string, with heading word&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1  -- table, extended if parsed&lt;br /&gt;
    --     2  -- stripped string, or false, if invalid text format&lt;br /&gt;
    local rO = assign&lt;br /&gt;
    local rS = analyse&lt;br /&gt;
    local s, sep = mw.ustring.match( analyse, &amp;quot;^([%a&amp;amp;;]+%.?)([^%a%.]?)&amp;quot; )&lt;br /&gt;
    if s then&lt;br /&gt;
        -- might begin with month name   &amp;quot;December 23, 2013&amp;quot;&lt;br /&gt;
        local n = Parser.monthNumber( s )&lt;br /&gt;
        if n then&lt;br /&gt;
            rO.month = n&lt;br /&gt;
            if sep == &amp;quot;&amp;quot; then&lt;br /&gt;
                rS = &amp;quot;&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local s2, s3&lt;br /&gt;
                n = mw.ustring.len( s )  +  1&lt;br /&gt;
                s = mw.ustring.sub( analyse, n )&lt;br /&gt;
                s2 = s:match( &amp;quot;^ (%d%d%d?%d?)$&amp;quot; )&lt;br /&gt;
                if s2 then&lt;br /&gt;
                    rO.year = tonumber( s2 )&lt;br /&gt;
                    rS = &amp;quot;&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    s2, s3, rS = s:match( &amp;quot;^ (%d+), (%d+)( ?.*)$&amp;quot; )&lt;br /&gt;
                    if s2 and s3 then&lt;br /&gt;
                        n = #s2&lt;br /&gt;
                        if n &amp;lt;= 2  and  #s3 == 4 then&lt;br /&gt;
                            rO.dom  = tonumber( s2 )&lt;br /&gt;
                            rO.year = tonumber( s3 )&lt;br /&gt;
                            rO.dom2 = ( n == 2 )&lt;br /&gt;
                        else&lt;br /&gt;
                            rO = false&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        rO = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            rO = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        rO = false&lt;br /&gt;
    end&lt;br /&gt;
    if not rO then&lt;br /&gt;
        rS = false&lt;br /&gt;
    end&lt;br /&gt;
    return rO, rS&lt;br /&gt;
end -- Parser.monthHeading()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.monthNumber = function ( analyse )&lt;br /&gt;
    -- String analysis, retrieve month number&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string, with month name including any period&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number, 1...12 if found&lt;br /&gt;
    --     false or nil, if not detected&lt;br /&gt;
    local r = false&lt;br /&gt;
    local s = mw.ustring.match( analyse, &amp;quot;^([%a&amp;amp;;]+)%.?$&amp;quot; )&lt;br /&gt;
    if s then&lt;br /&gt;
        local given&lt;br /&gt;
        s = capitalize( s )&lt;br /&gt;
        for k, v in pairs( World.monthsLong ) do&lt;br /&gt;
            given = World.monthsParse[ k ]&lt;br /&gt;
            if given then&lt;br /&gt;
                r = given[ s ]&lt;br /&gt;
            end&lt;br /&gt;
            if not r then&lt;br /&gt;
                given = World.monthsLong[ k ]&lt;br /&gt;
                for i = 1, 12 do&lt;br /&gt;
                    if given[ i ] == s then&lt;br /&gt;
                        r = i&lt;br /&gt;
                        break&lt;br /&gt;
                    end&lt;br /&gt;
                end -- for i&lt;br /&gt;
            end&lt;br /&gt;
            if r then&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Parser.monthNumber()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.putDate = function ( aYear, aMonth, aDom, assign )&lt;br /&gt;
    -- Store date strings&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     aYear   -- string, with year, or false&lt;br /&gt;
    --     aMonth  -- string, with numeric month&lt;br /&gt;
    --     aDom    -- string, with day of month&lt;br /&gt;
    --     assign  -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended&lt;br /&gt;
    local r = assign&lt;br /&gt;
    if aYear then&lt;br /&gt;
        r.year   = tonumber( aYear )&lt;br /&gt;
    end&lt;br /&gt;
    r.month  = tonumber( aMonth )&lt;br /&gt;
    r.dom    = tonumber( aDom )&lt;br /&gt;
    r.month2 = ( #aMonth == 2 )&lt;br /&gt;
    r.dom2   = ( #aDom == 2 )&lt;br /&gt;
    return r&lt;br /&gt;
end -- Parser.putDate()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.time = function ( analyse, assign, adjusted )&lt;br /&gt;
    -- String analysis, retrieve time components&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse   -- string, with time part&lt;br /&gt;
    --     assign    -- table&lt;br /&gt;
    --     adjusted  -- true: fixed length of 2 digits expected&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    local r = assign&lt;br /&gt;
    if analyse ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local s, sx = analyse:match( &amp;quot;^(%d+)(:?.*)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            local n = #s&lt;br /&gt;
            if n &amp;lt;= 2 then&lt;br /&gt;
                r.hour  = tonumber( s )&lt;br /&gt;
                if not adjusted then&lt;br /&gt;
                    r.hour2 = ( n == 2 )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                sx = false&lt;br /&gt;
                r  = false&lt;br /&gt;
            end&lt;br /&gt;
            if sx then&lt;br /&gt;
                s, sx = sx:match( &amp;quot;^:(%d+)(:?(.*))$&amp;quot;  )&lt;br /&gt;
                if s then&lt;br /&gt;
                    if #s == 2 then&lt;br /&gt;
                        r.min = tonumber( s )&lt;br /&gt;
                        if sx == &amp;quot;&amp;quot; then&lt;br /&gt;
                            sx = false&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        sx = false&lt;br /&gt;
                        r  = false&lt;br /&gt;
                    end&lt;br /&gt;
                    if sx then&lt;br /&gt;
                        local sep&lt;br /&gt;
                        local scan = &amp;quot;^([:,] ?)(%d+)(.*)$&amp;quot;&lt;br /&gt;
                        sep, s, sx = sx:match( scan )&lt;br /&gt;
                        if sep == &amp;quot;:&amp;quot; then&lt;br /&gt;
                            if #s == 2 then&lt;br /&gt;
                                r.sec = tonumber( s )&lt;br /&gt;
                            end&lt;br /&gt;
                        elseif sep == &amp;quot;, &amp;quot; then&lt;br /&gt;
                            r = Parser.wikiDate( s .. sx,  r )&lt;br /&gt;
                            sx = false&lt;br /&gt;
                        else&lt;br /&gt;
                            r = false&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if sx  and  sx ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                s = sx:match( &amp;quot;^%.(%d+)$&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                    s  = s .. &amp;quot;00&amp;quot;&lt;br /&gt;
                    r.msec = tonumber( s:sub( 1, 3 ) )&lt;br /&gt;
                    if #s &amp;gt;= 6 then&lt;br /&gt;
                        r.mysec = tonumber( s:sub( 4, 6 ) )&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = false&lt;br /&gt;
                end&lt;br /&gt;
            end&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 -- Parser.time()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.wikiDate = function ( analyse, assign )&lt;br /&gt;
    -- String analysis, for date after wiki ~~~~~ signature time&lt;br /&gt;
    --     dmy    10:28, 30. Dez. 2013&lt;br /&gt;
    --     ymd    10:28, 2013 Dez. 30&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    local r&lt;br /&gt;
    local s = analyse:match( &amp;quot;^(2%d%d%d) &amp;quot; )&lt;br /&gt;
    local sx&lt;br /&gt;
    if s then&lt;br /&gt;
        -- ymd    &amp;quot;10:28, 2013 Dez. 30&amp;quot;&lt;br /&gt;
        local n = false&lt;br /&gt;
        r = assign&lt;br /&gt;
        r.year = tonumber( s )&lt;br /&gt;
        s = analyse:sub( 6 )&lt;br /&gt;
        s, sx = mw.ustring.match( analyse:sub( 6 ),&lt;br /&gt;
                                  &amp;quot;^([%a&amp;amp;;]+)%.? (%d%d?)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            n = Parser.monthNumber( s )&lt;br /&gt;
            if n then&lt;br /&gt;
               r.month = n&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if n then&lt;br /&gt;
            r.dom  = tonumber( sx )&lt;br /&gt;
            r.dom2 = ( #sx == 2 )&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        -- dmy    &amp;quot;10:28, 30. Dez. 2013&amp;quot;&lt;br /&gt;
        local sep&lt;br /&gt;
        s, sep, sx = analyse:match( &amp;quot;^(%d%d?)(%.? ?)(%a.+)$&amp;quot; )&lt;br /&gt;
        if s then&lt;br /&gt;
            r = Parser.european( s, sep, sx, assign )&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 -- Parser.wikiDate()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.yearTime = function ( analyse, assign )&lt;br /&gt;
    -- String analysis, for possible year and possible time&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string, starting with year&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, extended if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    local r = assign&lt;br /&gt;
    local n = #analyse&lt;br /&gt;
    if n &amp;gt; 0 then&lt;br /&gt;
        local s, sx&lt;br /&gt;
        if n == 4 then&lt;br /&gt;
            if analyse:match( &amp;quot;^%d%d%d%d$&amp;quot; ) then&lt;br /&gt;
                s  = analyse&lt;br /&gt;
                sx = false&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            s = analyse:match( &amp;quot;^(%d%d%d%d)[ ,]&amp;quot; )&lt;br /&gt;
            if s then&lt;br /&gt;
                sx = analyse:sub( 5 )&lt;br /&gt;
            else&lt;br /&gt;
                local suffix&lt;br /&gt;
                s, sx, suffix = analyse:match( &amp;quot;^(%d+)([ ,]?)(.*)$&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                    local j = #sx&lt;br /&gt;
                    n = #s&lt;br /&gt;
                    if n &amp;lt; 4  and  ( j == 1 or #suffix == 0 ) then&lt;br /&gt;
                        sx = analyse:sub( n + j )&lt;br /&gt;
                    else&lt;br /&gt;
                        s = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if s then&lt;br /&gt;
            r.year = tonumber( s )&lt;br /&gt;
            if sx then&lt;br /&gt;
                s, sx = sx:match( &amp;quot;^(,? ?)(%d.*)$&amp;quot; )&lt;br /&gt;
                if #s &amp;gt;= 1 then&lt;br /&gt;
                    r = Parser.time( sx, r )&lt;br /&gt;
                end&lt;br /&gt;
            end&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 -- Parser.yearTime()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.zone = function ( analyse, assign )&lt;br /&gt;
    -- String analysis, for time zone&lt;br /&gt;
    -- +/-nn +/-nnnn (AAAa)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    --     assign   -- table&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1  -- table, with number or string zone, if any, or false&lt;br /&gt;
    --     2  -- string, with zone stripped off, if any&lt;br /&gt;
    local rO = assign&lt;br /&gt;
    local rS = analyse&lt;br /&gt;
    local s, sign, shift, sub&lt;br /&gt;
    s = &amp;quot;^(.+)([+-])([01]%d):?(%d?%d?)$&amp;quot;&lt;br /&gt;
    s, sign, shift, sub = analyse:match( s )&lt;br /&gt;
    if sign then&lt;br /&gt;
        if s:find( &amp;quot;:%d%d *$&amp;quot; ) then&lt;br /&gt;
            if sub then&lt;br /&gt;
                if #sub == 2 then&lt;br /&gt;
                    rO.zone = tonumber( shift .. sub )&lt;br /&gt;
                else&lt;br /&gt;
                    rO = false&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                rO.zone = tonumber( shift ) * 100&lt;br /&gt;
            end&lt;br /&gt;
            if rO then&lt;br /&gt;
                if sign == &amp;quot;-&amp;quot; then&lt;br /&gt;
                    rO.zone = - rO.zone&lt;br /&gt;
                end&lt;br /&gt;
                rS = mw.text.trim( s )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    elseif analyse:find( &amp;quot;%(.*%)$&amp;quot; ) then&lt;br /&gt;
        s, shift = analyse:match( &amp;quot;^(.+)%((%a%a%a%a?)%)$&amp;quot; )&lt;br /&gt;
        if shift then&lt;br /&gt;
            rO.zone = shift:upper()&lt;br /&gt;
            rS      = mw.text.trim( s )&lt;br /&gt;
        else&lt;br /&gt;
            rO = false&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        s, shift = analyse:match( &amp;quot;^(.+%d) ?(%a+)$&amp;quot; )&lt;br /&gt;
        if shift then&lt;br /&gt;
            local n = #shift&lt;br /&gt;
            if n == 1 then&lt;br /&gt;
                rO.zone = shift:upper()&lt;br /&gt;
            elseif n == 3 then&lt;br /&gt;
                if shift == &amp;quot;UTC&amp;quot;  or  shift == &amp;quot;GMT&amp;quot; then&lt;br /&gt;
                    rO.zone = 0&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if rO.zone then&lt;br /&gt;
                rS = s&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return rO, rS&lt;br /&gt;
end -- Parser.zone()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Parser.GermanEnglish = function ( analyse )&lt;br /&gt;
    -- String analysis, for German and English formats&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string, with date or time or parts of it&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    local r, s = Parser.eraGermanEnglish( analyse )&lt;br /&gt;
    r, s = Parser.zone( s, r )&lt;br /&gt;
    if r then&lt;br /&gt;
        local start, sep, sx = s:match( &amp;quot;^(%d+)([ %-%.:WwT]?)(.*)$&amp;quot; )&lt;br /&gt;
        if start then&lt;br /&gt;
            -- begins with one or more digits (ASCII)&lt;br /&gt;
            local n    = #start&lt;br /&gt;
            local lazy = ( start == s   and&lt;br /&gt;
                           ( n &amp;gt;=4  or  type( r.bc == &amp;quot;boolean&amp;quot; ) ) )&lt;br /&gt;
            if n == 4  or  n == 8  or  lazy then&lt;br /&gt;
                r = Parser.digitsHeading( s, lazy, n, r )&lt;br /&gt;
            elseif n &amp;lt;= 2 then&lt;br /&gt;
                if sep == &amp;quot;:&amp;quot; then&lt;br /&gt;
                    r, s = Parser.time( s, r )&lt;br /&gt;
                elseif sep == &amp;quot;&amp;quot; then&lt;br /&gt;
                    r = false&lt;br /&gt;
                else&lt;br /&gt;
                    r = Parser.european( start, sep, sx, r )&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local rM, sM = Parser.monthHeading( s, r )&lt;br /&gt;
            if rM then&lt;br /&gt;
                r = rM&lt;br /&gt;
            else&lt;br /&gt;
                r, sM = Parser.isoDate( s, r )&lt;br /&gt;
            end&lt;br /&gt;
            if r and sM ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                r = Parser.time( sM, r )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Parser.GermanEnglish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.factory = function ( assign, alien, add )&lt;br /&gt;
    -- Create DateTime table (constructor)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assign  -- string, with initial timestamp, or nil&lt;br /&gt;
    --                nil    -- now&lt;br /&gt;
    --                false  -- empty object&lt;br /&gt;
    --     alien   -- string, with language code, or nil&lt;br /&gt;
    --     add     -- string, with interval (PHP strtotime), or nil&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, for DateTime object&lt;br /&gt;
    --     string or false, if failed&lt;br /&gt;
    local l     = true&lt;br /&gt;
    local slang = mw.text.trim( alien or World.slang or &amp;quot;en&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if assign == false then&lt;br /&gt;
        r = { }&lt;br /&gt;
    else&lt;br /&gt;
        local stamp = ( assign or &amp;quot;now&amp;quot; )&lt;br /&gt;
        local shift&lt;br /&gt;
        if add then&lt;br /&gt;
            shift = Private.future( add )&lt;br /&gt;
        end&lt;br /&gt;
        r = false&lt;br /&gt;
        if stamp == &amp;quot;now&amp;quot; then&lt;br /&gt;
            stamp = frame():callParserFunction( &amp;quot;#timel&amp;quot;, &amp;quot;c&amp;quot;, shift )&lt;br /&gt;
            shift = false&lt;br /&gt;
        else&lt;br /&gt;
            local seconds = stamp:match( &amp;quot;^#(%d+)$&amp;quot; )&lt;br /&gt;
            if seconds then&lt;br /&gt;
                stamp = os.date( &amp;quot;!%Y-%m-%dT%H:%M:%S&amp;quot;,&lt;br /&gt;
                                 tonumber( seconds ) )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        l, r = pcall( Private.fetch, stamp, slang, shift )&lt;br /&gt;
    end&lt;br /&gt;
    if l  and  type( r ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if slang ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            r.lang = slang&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.factory()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.fetch = function ( analyse, alien, add )&lt;br /&gt;
    -- Retrieve object from string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string to be interpreted&lt;br /&gt;
    --     alien    -- string with language code, or nil&lt;br /&gt;
    --     add      -- table, with interval, or nil&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, if parsed&lt;br /&gt;
    --     false, if invalid text format&lt;br /&gt;
    --     string, if serious error (args)&lt;br /&gt;
    local r&lt;br /&gt;
    if type( analyse ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        local strip = mw.ustring.char( 0x5B, 0x200E, 0x200F, 0x5D )&lt;br /&gt;
        r =  analyse:gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;&amp;amp;#160;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;&amp;amp;#x[aA]0;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;&amp;amp;#32;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( DateTime.char.nbsp, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( DateTime.char.tab,  &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;  +&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;%[%[&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                    :gsub( &amp;quot;%]%]&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                    :gsub( strip, &amp;quot;&amp;quot; )&lt;br /&gt;
        r = mw.text.trim( r )&lt;br /&gt;
        if r == &amp;quot;&amp;quot; then&lt;br /&gt;
            r = { }&lt;br /&gt;
        else&lt;br /&gt;
            local slang  = ( alien or &amp;quot;&amp;quot; )&lt;br /&gt;
            local parser = { en  = &amp;quot;GermanEnglish&amp;quot;,&lt;br /&gt;
                             de  = &amp;quot;GermanEnglish&amp;quot;,&lt;br /&gt;
                             frr = &amp;quot;GermanEnglish&amp;quot;,&lt;br /&gt;
                             nds = &amp;quot;GermanEnglish&amp;quot; }&lt;br /&gt;
            local suitable&lt;br /&gt;
            if slang == &amp;quot;&amp;quot; then&lt;br /&gt;
                slang = &amp;quot;en&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                local s = slang:match( &amp;quot;^(%a+)%-&amp;quot; )&lt;br /&gt;
                if s then&lt;br /&gt;
                     slang = s&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            slang    = slang:lower()&lt;br /&gt;
            suitable = parser[ slang ]&lt;br /&gt;
            if suitable then&lt;br /&gt;
                local l&lt;br /&gt;
                l, r = pcall( Parser[ suitable ], r )&lt;br /&gt;
                if l and r then&lt;br /&gt;
                    if not Prototypes.fair( r ) then&lt;br /&gt;
                        r = false&lt;br /&gt;
                    elseif add then&lt;br /&gt;
                        r = Prototypes.future( r, add )&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = &amp;quot;invalid format&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;unknown language: &amp;quot; .. slang&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = &amp;quot;bad type&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.field = function ( at, ask, adapt, atleast )&lt;br /&gt;
    -- Format object as string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     at       -- DateTime&lt;br /&gt;
    --     ask      -- string, with format spec, or nil&lt;br /&gt;
    --     adapt    -- table, with options, or nil&lt;br /&gt;
    --                 .lang    -- string, with particular language code&lt;br /&gt;
    --                 .london  -- true: UTC output; default: local&lt;br /&gt;
    --                 .lonely  -- true: permit lonely hour&lt;br /&gt;
    --     atleast  -- string, with default value, or nil&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, or false, if invalid, or number for julian date&lt;br /&gt;
    local r, spec&lt;br /&gt;
    if type( ask ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        if ask:sub( 1, 1 ) == &amp;quot;$&amp;quot; then&lt;br /&gt;
            if ask:sub( 1, 11 ) == &amp;quot;$JulianDate&amp;quot; then&lt;br /&gt;
                local luxury = ( ask:sub( -2 ) == &amp;quot;,$&amp;quot; )&lt;br /&gt;
                if ask:sub( 1, 14 ) == &amp;quot;$JulianDateJul&amp;quot; then&lt;br /&gt;
                    at.legacy = true&lt;br /&gt;
                elseif ask:sub( 1, 15 ) == &amp;quot;$JulianDateGreg&amp;quot; then&lt;br /&gt;
                else&lt;br /&gt;
                    at.legacy = Private.former( at )&lt;br /&gt;
                end&lt;br /&gt;
                r = Private.fixed( at, luxury )&lt;br /&gt;
            elseif ask:sub( 1, 11 ) == &amp;quot;$JulianCal$&amp;quot; then&lt;br /&gt;
                adapt.legacy = true&lt;br /&gt;
                spec = ask:sub( 12 )&lt;br /&gt;
            elseif ask:sub( 1, 3 ) == &amp;quot;$\&amp;quot;$&amp;quot; then&lt;br /&gt;
                r = ask:sub( 4 )&lt;br /&gt;
            else&lt;br /&gt;
                spec = ask&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            spec = ask&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        spec = false&lt;br /&gt;
    end&lt;br /&gt;
    if not r then&lt;br /&gt;
        r = Private.format( at, spec, adapt )&lt;br /&gt;
    end&lt;br /&gt;
    return r or atleast&lt;br /&gt;
end -- Private.field()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.fixed = function ( at, advanced )&lt;br /&gt;
    -- Compute julian date&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     at        -- DateTime&lt;br /&gt;
    --                  .legacy  -- true: at is in Julian calendar&lt;br /&gt;
    --     advanced  -- true: format long number&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number, or string&lt;br /&gt;
    local mM, mMY, mY, nY, r&lt;br /&gt;
    if at.year then&lt;br /&gt;
        mY = at.year * 12&lt;br /&gt;
    else    -- actually invalid&lt;br /&gt;
        mY = 0&lt;br /&gt;
    end&lt;br /&gt;
    if at.month then&lt;br /&gt;
        mMY = at.month&lt;br /&gt;
    else&lt;br /&gt;
        mMY = 1&lt;br /&gt;
    end&lt;br /&gt;
    mMY = mMY + 57609&lt;br /&gt;
    if at.dom then&lt;br /&gt;
        r = at.dom&lt;br /&gt;
    else&lt;br /&gt;
        r = 1&lt;br /&gt;
    end&lt;br /&gt;
    mM = ( mY + mMY )  *  0.08333333333    -- divided by 12 months&lt;br /&gt;
    nY = math.floor( mM - 1 )&lt;br /&gt;
    r  = math.floor( nY * 365.25 )&lt;br /&gt;
         + math.floor( ( mMY%12 + 4 )  *  30.6 )&lt;br /&gt;
         + r&lt;br /&gt;
        if at.legacy then&lt;br /&gt;
            r = r - 32205.5&lt;br /&gt;
        else&lt;br /&gt;
            r = r - math.floor( nY * 0.01 )     -- no leap day in century&lt;br /&gt;
                  + math.floor( nY * 0.0025 )   -- but every 400 years&lt;br /&gt;
                  - 32167.5&lt;br /&gt;
        end&lt;br /&gt;
    if at.hour then   -- divided by 24 hours per day&lt;br /&gt;
        r = r  +  at.hour * 0.0416666666666667&lt;br /&gt;
    else&lt;br /&gt;
        r = r + 0.5&lt;br /&gt;
    end&lt;br /&gt;
    if at.min then    -- divided by 1440 minutes per day&lt;br /&gt;
        r = r  +  at.min * 0.000694444444&lt;br /&gt;
    end&lt;br /&gt;
    if at.sec then    -- divided by 86400 seconds per day&lt;br /&gt;
        r = r  +  at.min * 0.00001157407407&lt;br /&gt;
    end&lt;br /&gt;
    if at.bc then&lt;br /&gt;
        r = 3442406 - r&lt;br /&gt;
        if at.legacy then&lt;br /&gt;
            r = r + 3&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if advanced then&lt;br /&gt;
        local slang = ( at.lang or World.slang )&lt;br /&gt;
        local o = mw.language.new( slang )&lt;br /&gt;
        r = o:formatNum( r )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.fixed()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.flow = function ( at1, at2 )&lt;br /&gt;
    -- Compare two objects&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     at1  -- DateTime&lt;br /&gt;
    --     at2  -- DateTime&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     -1, 0, 1 or nil if not comparable&lt;br /&gt;
    local r = 0&lt;br /&gt;
    if at1.bc or at2.bc  and  at1.bc ~= at2.bc then&lt;br /&gt;
        if at1.bc then&lt;br /&gt;
            r = -1&lt;br /&gt;
        else&lt;br /&gt;
            r = 1&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        local life  = false&lt;br /&gt;
        local s, v1, v2&lt;br /&gt;
        for i = 2, 10 do&lt;br /&gt;
            s  = Meta.order[ i ]&lt;br /&gt;
            v1 = at1[ s ]&lt;br /&gt;
            v2 = at2[ s ]&lt;br /&gt;
            if v1 or v2 then&lt;br /&gt;
                if v1 and v2 then&lt;br /&gt;
                    if v1 &amp;lt; v2 then&lt;br /&gt;
                        r = -1&lt;br /&gt;
                    elseif v1 &amp;gt; v2 then&lt;br /&gt;
                        r = 1&lt;br /&gt;
                    end&lt;br /&gt;
                elseif life then&lt;br /&gt;
                    if v2 then&lt;br /&gt;
                        r = -1&lt;br /&gt;
                    else&lt;br /&gt;
                        r = 1&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    r = nil&lt;br /&gt;
                end&lt;br /&gt;
                if r ~= 0 then&lt;br /&gt;
                    if at1.bc and r then&lt;br /&gt;
                        r = r * -1&lt;br /&gt;
                    end&lt;br /&gt;
                    break    -- for i&lt;br /&gt;
                end&lt;br /&gt;
                life = true&lt;br /&gt;
            end&lt;br /&gt;
        end -- for i&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.flow()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.foreign = function ()&lt;br /&gt;
    -- Retrieve localization submodule&lt;br /&gt;
    if not Meta.localized then&lt;br /&gt;
        local d = foreignModule( DateTime.suite,&lt;br /&gt;
                                 false,&lt;br /&gt;
                                 &amp;quot;local&amp;quot;,&lt;br /&gt;
                                 DateTime.item )&lt;br /&gt;
        if type( d ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local wk&lt;br /&gt;
            if d.slang then&lt;br /&gt;
                Meta.suite  = string.format( &amp;quot;%s %s&amp;quot;,&lt;br /&gt;
                                             Meta.suite, d.slang )&lt;br /&gt;
                World.slang = d.slang&lt;br /&gt;
            end&lt;br /&gt;
            for k, v in pairs( d ) do&lt;br /&gt;
                wk = World[ k ]&lt;br /&gt;
                if wk  and  wk.en then&lt;br /&gt;
                    for subk, subv in pairs( v ) do&lt;br /&gt;
                        wk[ subk ] = subv&lt;br /&gt;
                    end -- for k, v&lt;br /&gt;
                else&lt;br /&gt;
                    World[ k ] = v&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
        Meta.localized = true&lt;br /&gt;
    end&lt;br /&gt;
end -- Private.foreign()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.format = function ( at, ask, adapt )&lt;br /&gt;
    -- Format object as string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     at     -- table, with numbers etc.&lt;br /&gt;
    --     ask    -- string, format spec, or nil&lt;br /&gt;
    --     adapt  -- table, with options, or nil&lt;br /&gt;
    --               .lang    -- string, with particular language code&lt;br /&gt;
    --               .london  -- true: UTC output; default: local&lt;br /&gt;
    --               .lonely  -- true: permit lonely hour&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, or not&lt;br /&gt;
    local slang = at.lang or &amp;quot;en&amp;quot;&lt;br /&gt;
    local opts  = { lang = slang }&lt;br /&gt;
    local babel, r&lt;br /&gt;
    if type( adapt ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        if type( adapt.lang ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            local i = adapt.lang:find( &amp;quot;-&amp;quot;, 3, true )&lt;br /&gt;
            if i then&lt;br /&gt;
                slang = adapt.lang:lower()&lt;br /&gt;
                opts.lang = slang:sub( 1,  i - 1 )&lt;br /&gt;
            else&lt;br /&gt;
                opts.lang = adapt.lang:lower()&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        opts.london = adapt.london&lt;br /&gt;
        opts.lonely = adapt.lonely&lt;br /&gt;
    end&lt;br /&gt;
    babel = mw.language.new( opts.lang:lower() )&lt;br /&gt;
    if babel then&lt;br /&gt;
        local shift, show, stamp, suffix, limit4, locally&lt;br /&gt;
        if at.month then&lt;br /&gt;
            stamp = World.monthsLong.en[ at.month ]&lt;br /&gt;
            if at.year then&lt;br /&gt;
                stamp = string.format( &amp;quot;%s %04d&amp;quot;, stamp, at.year )&lt;br /&gt;
            end&lt;br /&gt;
            if at.dom then&lt;br /&gt;
                stamp = string.format( &amp;quot;%d %s&amp;quot;, at.dom, stamp )&lt;br /&gt;
            end&lt;br /&gt;
            if ask and ask:find( &amp;quot;Mon4&amp;quot;, 1, true ) then&lt;br /&gt;
                local mon4 = World.months4[ opts.lang:lower() ]&lt;br /&gt;
                if mon4  and  mon4[ at.month ] then&lt;br /&gt;
                    limit4 = true&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        elseif at.year then&lt;br /&gt;
            stamp = string.format( &amp;quot;%04d&amp;quot;, at.year )&lt;br /&gt;
        end&lt;br /&gt;
        if at.hour then&lt;br /&gt;
            if stamp then&lt;br /&gt;
                stamp = stamp .. &amp;quot; &amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                stamp = &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            stamp = string.format( &amp;quot;%s%02d:&amp;quot;, stamp, at.hour )&lt;br /&gt;
            if at.min then&lt;br /&gt;
                stamp = string.format( &amp;quot;%s%02d&amp;quot;, stamp, at.min )&lt;br /&gt;
                if at.sec then&lt;br /&gt;
                    stamp = string.format( &amp;quot;%s:%02d&amp;quot;,&lt;br /&gt;
                                           stamp, at.sec )&lt;br /&gt;
                    if at.msec then&lt;br /&gt;
                        stamp = string.format( &amp;quot;%s.%03d&amp;quot;,&lt;br /&gt;
                                               stamp, at.msec )&lt;br /&gt;
                        if at.mysec then&lt;br /&gt;
                            stamp = string.format( &amp;quot;%s%03d&amp;quot;,&lt;br /&gt;
                                                   stamp,&lt;br /&gt;
                                                   at.mysec )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                stamp = stamp .. &amp;quot;00&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            if at.zone then&lt;br /&gt;
                stamp = stamp .. World.zones.formatter( at, &amp;quot;+-&amp;quot; )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        show, suffix = World.templates.formatter( at, ask, opts )&lt;br /&gt;
        if limit4 then&lt;br /&gt;
            show = show:gsub( &amp;quot;M&amp;quot;, &amp;quot;F&amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
        if type( opts.london ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
            locally = not opts.london&lt;br /&gt;
        else&lt;br /&gt;
            locally = true&lt;br /&gt;
        end&lt;br /&gt;
        r = babel:formatDate( show, stamp, locally )&lt;br /&gt;
        r = r:gsub( &amp;quot;&amp;amp;#160;$&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
        if at.year and at.year &amp;lt; 1000 then&lt;br /&gt;
            r = r:gsub( string.format( &amp;quot;%04d&amp;quot;, at.year ),&lt;br /&gt;
                        tostring( at.year ) )&lt;br /&gt;
        end&lt;br /&gt;
        if at.month then&lt;br /&gt;
            local bucket, m, suite, x&lt;br /&gt;
            if show:find( &amp;quot;F&amp;quot;, 1, true ) then&lt;br /&gt;
                suite = &amp;quot;monthsLong&amp;quot;&lt;br /&gt;
            elseif show:find( &amp;quot;M&amp;quot;, 1, true ) then&lt;br /&gt;
                suite = &amp;quot;monthsAbbr&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            bucket = World[ suite ]&lt;br /&gt;
            if bucket then&lt;br /&gt;
                m = bucket[ opts.lang:lower() ]&lt;br /&gt;
                if slang then&lt;br /&gt;
                    x = bucket[ slang:lower() ]&lt;br /&gt;
                end&lt;br /&gt;
                if m then&lt;br /&gt;
                    local base = m[ at.month ]&lt;br /&gt;
                    local ex&lt;br /&gt;
                    if x then&lt;br /&gt;
                        ex = x[ at.month ]&lt;br /&gt;
                    end&lt;br /&gt;
                    if suite == &amp;quot;monthsAbbr&amp;quot; then&lt;br /&gt;
                        local stop&lt;br /&gt;
                        if ex then&lt;br /&gt;
                            stop = x.suffix&lt;br /&gt;
                            base = ex&lt;br /&gt;
                        else&lt;br /&gt;
                            stop = m.suffix&lt;br /&gt;
                        end&lt;br /&gt;
                        if base and stop then&lt;br /&gt;
                            local shift, std&lt;br /&gt;
                            std   = string.format( &amp;quot;%s%%%s&amp;quot;,&lt;br /&gt;
                                                   base[ 1 ], stop )&lt;br /&gt;
                            shift = string.format( &amp;quot;%s%s&amp;quot;,&lt;br /&gt;
                                                   base[ 2 ], stop )&lt;br /&gt;
                            r = mw.ustring.gsub( r, std, shift )&lt;br /&gt;
                        end&lt;br /&gt;
                    elseif suite == &amp;quot;monthsLong&amp;quot; then&lt;br /&gt;
                        if base and ex then&lt;br /&gt;
                            r = mw.ustring.gsub( r, base, ex )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if suffix then&lt;br /&gt;
            r = r .. suffix&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.former = function ( at )&lt;br /&gt;
    -- Analyze whether Julian calendar&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     at  -- table, to be evaluated&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     true, i&lt;br /&gt;
    local r&lt;br /&gt;
    if at.year then&lt;br /&gt;
        if at.year &amp;lt; 1582 then&lt;br /&gt;
            r = true&lt;br /&gt;
        elseif at.year == 1582 then&lt;br /&gt;
            if at.month then&lt;br /&gt;
                if at.month &amp;lt; 10 then&lt;br /&gt;
                    r = true&lt;br /&gt;
                elseif at.month == 10 then&lt;br /&gt;
                    r = ( at.dom &amp;lt;= 15 )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.former()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.from = function ( attempt )&lt;br /&gt;
    -- Create valid raw table from arbitrary table&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     attempt  -- table, to be evaluated&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, with valid components, or nil&lt;br /&gt;
    local data  = { }&lt;br /&gt;
    local r&lt;br /&gt;
    for k, v in pairs( Meta.components ) do&lt;br /&gt;
        if v then&lt;br /&gt;
            v = ( type( attempt[ k ] )  ==  v )&lt;br /&gt;
        else&lt;br /&gt;
            v = true&lt;br /&gt;
        end&lt;br /&gt;
        if v then&lt;br /&gt;
            data[ k ] = attempt[ k ]&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    if Prototypes.fair( data ) then&lt;br /&gt;
        r = data&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.from()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Private.future = function ( add )&lt;br /&gt;
    -- Normalize move interval&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     add   -- string or number, to be added&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, with shift, or false/nil&lt;br /&gt;
    local r&lt;br /&gt;
    if add then&lt;br /&gt;
        local s = type( add )&lt;br /&gt;
        if s == &amp;quot;string&amp;quot;  and  add:match( &amp;quot;^%s*[+-]?%d+%.?%d*%s*$&amp;quot; ) then&lt;br /&gt;
            r = tonumber( add )&lt;br /&gt;
            s = &amp;quot;number&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if s == &amp;quot;number&amp;quot; then&lt;br /&gt;
            if r == 0 then&lt;br /&gt;
                r = false&lt;br /&gt;
            else&lt;br /&gt;
                r = string.format( &amp;quot;%d second&amp;quot;,  r or add )&lt;br /&gt;
            end&lt;br /&gt;
        elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
            r = add&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
        if r then&lt;br /&gt;
            r = Calc.future( r )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Private.future()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.clone = function ( self )&lt;br /&gt;
    -- Clone object&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, with object, to be cloned&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, with object&lt;br /&gt;
    local r = { [ Meta.signature ] = self[ Meta.signature ] }&lt;br /&gt;
    setmetatable( r, Meta.tableI )&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.clone()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.failsafe = function ( self, atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     self     -- table, or not, with DateTime object, unused&lt;br /&gt;
    --     atleast  -- string, with required version&lt;br /&gt;
    --                         or &amp;quot;wikidata&amp;quot; or &amp;quot;~&amp;quot; or &amp;quot;@&amp;quot; or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2020-08-17&lt;br /&gt;
    local since = atleast&lt;br /&gt;
    local last    = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked  = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link    = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Meta.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 suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if linkedlink then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&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&lt;br /&gt;
                           vsn.value == ( Meta.serial or&lt;br /&gt;
                                          DateTime.serial ) then&lt;br /&gt;
                            r = false&lt;br /&gt;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&lt;br /&gt;
                        else&lt;br /&gt;
                            r = vsn.value&lt;br /&gt;
                        end&lt;br /&gt;
                        if last 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;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Meta.serial then&lt;br /&gt;
            r = Meta.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 -- Prototypes.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.fair = function ( self, access, assign )&lt;br /&gt;
    -- Check formal validity of table&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self    -- table, to be checked&lt;br /&gt;
    --     access  -- string or nil, single item to be checked&lt;br /&gt;
    --     assign  -- single access value to be checked&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     true, if valid;  false, if not&lt;br /&gt;
    local r = ( type( self ) == &amp;quot;table&amp;quot; )&lt;br /&gt;
    if r then&lt;br /&gt;
        local defs = { year  = { max = MaxYear },&lt;br /&gt;
                       month = { min =  1,&lt;br /&gt;
                                 max = 12 },&lt;br /&gt;
                       week  = { min =  1,&lt;br /&gt;
                                 max = 53 },&lt;br /&gt;
                       dom   = { min =  1,&lt;br /&gt;
                                 max = 31 },&lt;br /&gt;
                       hour  = { max = 23 },&lt;br /&gt;
                       min   = { max = 59 },&lt;br /&gt;
                       sec   = { max = 61 },&lt;br /&gt;
                       msec  = { max = 999 },&lt;br /&gt;
                       mysec = { max = 999 }&lt;br /&gt;
        }&lt;br /&gt;
        local fNum =&lt;br /&gt;
            function ( k, v )&lt;br /&gt;
                local ret = true&lt;br /&gt;
                local dk  = defs[ k ]&lt;br /&gt;
                if dk then&lt;br /&gt;
                    if type( dk.max ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                        ret = ( type( v ) == &amp;quot;number&amp;quot; )&lt;br /&gt;
                        if ret then&lt;br /&gt;
                            local min&lt;br /&gt;
                            if dk.min then&lt;br /&gt;
                                min = dk.min&lt;br /&gt;
                            else&lt;br /&gt;
                                min = 0&lt;br /&gt;
                            end&lt;br /&gt;
                            ret = ( v &amp;gt;= min  and  v &amp;lt;= dk.max&lt;br /&gt;
                                    and  math.floor( v ) == v )&lt;br /&gt;
                            if ret and dk.f then&lt;br /&gt;
                                ret = dk.f( v )&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                return ret&lt;br /&gt;
            end -- fNum()&lt;br /&gt;
        if self.bc then&lt;br /&gt;
            defs.year.max = 999999&lt;br /&gt;
        end&lt;br /&gt;
        defs.dom.f =&lt;br /&gt;
            function ()&lt;br /&gt;
                local ret&lt;br /&gt;
                local d&lt;br /&gt;
                if access == &amp;quot;dom&amp;quot; then&lt;br /&gt;
                    d = assign&lt;br /&gt;
                else&lt;br /&gt;
                    d = self.dom&lt;br /&gt;
                end&lt;br /&gt;
                if d then&lt;br /&gt;
                    ret = ( d &amp;lt;= 28 )&lt;br /&gt;
                    if not ret then&lt;br /&gt;
                        local m&lt;br /&gt;
                        if access == &amp;quot;month&amp;quot; then&lt;br /&gt;
                            m = assign&lt;br /&gt;
                        else&lt;br /&gt;
                            m = self.month&lt;br /&gt;
                        end&lt;br /&gt;
                        if m then&lt;br /&gt;
                            ret = ( d &amp;lt;= Calc.months[ m ] )&lt;br /&gt;
                            if ret then&lt;br /&gt;
                                local y&lt;br /&gt;
                                if access == &amp;quot;year&amp;quot; then&lt;br /&gt;
                                    y = assign&lt;br /&gt;
                                else&lt;br /&gt;
                                    y = self.year&lt;br /&gt;
                                end&lt;br /&gt;
                                if d == 29  and  m == 2  and  y then&lt;br /&gt;
                                    if y % 4 ~= 0   or&lt;br /&gt;
                                       ( y % 100 == 0  and&lt;br /&gt;
                                         y % 400 ~= 0 ) then&lt;br /&gt;
                                        ret = false&lt;br /&gt;
                                    end&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                else&lt;br /&gt;
                    ret = true&lt;br /&gt;
                end&lt;br /&gt;
                return ret&lt;br /&gt;
            end -- defs.dom.f()&lt;br /&gt;
        defs.sec.f =&lt;br /&gt;
            function ()&lt;br /&gt;
                local ret&lt;br /&gt;
                local second&lt;br /&gt;
                if access == &amp;quot;sec&amp;quot; then&lt;br /&gt;
                    second = assign&lt;br /&gt;
                else&lt;br /&gt;
                    second = self.sec&lt;br /&gt;
                end&lt;br /&gt;
                if second then&lt;br /&gt;
                    ret = ( second &amp;lt;= 59 )&lt;br /&gt;
                    if not ret and self.leap then&lt;br /&gt;
                        ret = true&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                return ret&lt;br /&gt;
            end -- defs.sec.f()&lt;br /&gt;
        if access or assign then&lt;br /&gt;
            r = ( type( access ) == &amp;quot;string&amp;quot; )&lt;br /&gt;
            if r then&lt;br /&gt;
                local def = defs[ access ]&lt;br /&gt;
                if def then&lt;br /&gt;
                    r = fNum( access, assign )&lt;br /&gt;
                    if r then&lt;br /&gt;
                        if def == &amp;quot;dom&amp;quot;  or&lt;br /&gt;
                           def == &amp;quot;month&amp;quot;  or&lt;br /&gt;
                           def == &amp;quot;year&amp;quot; then&lt;br /&gt;
                            r = defs.dom.f()&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif access == &amp;quot;lang&amp;quot; then&lt;br /&gt;
                    r = ( type( assign ) == &amp;quot;string&amp;quot; )&lt;br /&gt;
                    if r then&lt;br /&gt;
                        r = assign:match( &amp;quot;^%l%l%l?-?%a*$&amp;quot; )&lt;br /&gt;
                    end&lt;br /&gt;
                elseif access == &amp;quot;london&amp;quot; then&lt;br /&gt;
                    r = ( type( assign ) == &amp;quot;boolean&amp;quot; )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            local life  = false&lt;br /&gt;
            local leak  = false&lt;br /&gt;
            local s, v&lt;br /&gt;
            for i = 1, 10 do&lt;br /&gt;
                s = Meta.order[ i ]&lt;br /&gt;
                v = self[ s ]&lt;br /&gt;
                if v then&lt;br /&gt;
                    if not life and leak then&lt;br /&gt;
                        -- gap detected&lt;br /&gt;
                        r = false&lt;br /&gt;
                        break&lt;br /&gt;
                    else&lt;br /&gt;
                        if not fNum( s, v ) then&lt;br /&gt;
                            r = false&lt;br /&gt;
                            break    -- for i&lt;br /&gt;
                        end&lt;br /&gt;
                        life = true&lt;br /&gt;
                        leak = true&lt;br /&gt;
                    end&lt;br /&gt;
                elseif i == 3 then&lt;br /&gt;
                    if not self.week then&lt;br /&gt;
                        life = false&lt;br /&gt;
                    end&lt;br /&gt;
                elseif i ~= 4 then&lt;br /&gt;
                    life = false&lt;br /&gt;
                end&lt;br /&gt;
            end -- for i&lt;br /&gt;
            if self.week  and  ( self.month or self.dom ) then&lt;br /&gt;
                r = false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.fair()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.figure = function ( self, assign )&lt;br /&gt;
    -- Assign month by name&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self    -- table, to be filled&lt;br /&gt;
    --     assign  -- string, with month name&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     number 1...12, if valid;  false, if not&lt;br /&gt;
    local r = false&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot;  and  type( assign ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = Parser.monthNumber( assign )&lt;br /&gt;
        if r then&lt;br /&gt;
            self.month = r&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.figure()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.first = function ( self )&lt;br /&gt;
    -- Retrieve abbreviated month name in current language&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, to be evaluated&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, if defined;  false, if not&lt;br /&gt;
    local r&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot;  and  self.month then&lt;br /&gt;
        local slang = ( self.lang or World.slang )&lt;br /&gt;
        r = World.monthsLong[ slang ]&lt;br /&gt;
        if r then&lt;br /&gt;
            local brief = World.monthsAbbr[ slang ]&lt;br /&gt;
            r = r[ self.month ]&lt;br /&gt;
            if brief then&lt;br /&gt;
                local ex = brief[ self.month ]&lt;br /&gt;
                local s  = brief.suffix&lt;br /&gt;
                if ex then&lt;br /&gt;
                    r = ex[ 2 ]&lt;br /&gt;
                else&lt;br /&gt;
                    local n = brief.n or 3&lt;br /&gt;
                    r = mw.ustring.sub( r, 1, n )&lt;br /&gt;
                end&lt;br /&gt;
                if s then&lt;br /&gt;
                    r = r .. s&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.first()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.fix = function ( self )&lt;br /&gt;
    -- Adapt this object to local time if no explicit zone given&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, with numbers etc.&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
       not self.zone then&lt;br /&gt;
        local seconds = Prototypes.format( self, &amp;quot;Z&amp;quot; )&lt;br /&gt;
        Prototypes.future( self,  - tonumber( seconds ) )&lt;br /&gt;
    end&lt;br /&gt;
end -- Prototypes.fix()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.flow = function ( self, another, assert )&lt;br /&gt;
    -- Compare this object with another timestamp&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self     -- table, with numbers etc.&lt;br /&gt;
    --     another  -- DateTime or string or nil (now)&lt;br /&gt;
    --     assert   -- nil, or string with operator&lt;br /&gt;
    --                       &amp;quot;lt&amp;quot;, &amp;quot;le&amp;quot;, &amp;quot;eq&amp;quot;, &amp;quot;ne&amp;quot;, &amp;quot;ge&amp;quot;, &amp;quot;gt&amp;quot;,&lt;br /&gt;
    --                       &amp;quot;&amp;lt;&amp;quot;, &amp;quot;&amp;lt;=&amp;quot;, &amp;quot;==&amp;quot;, &amp;quot;~=&amp;quot;, &amp;quot;&amp;lt;&amp;gt;&amp;quot;, &amp;quot;&amp;gt;=&amp;quot;, &amp;quot;=&amp;gt;&amp;quot;, &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     if assert: true or false&lt;br /&gt;
    --     else: -1, 0, 1&lt;br /&gt;
    --     nil if invalid&lt;br /&gt;
    local base, other, r&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        base  = self&lt;br /&gt;
        other = another&lt;br /&gt;
    elseif type( another ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        base  = another&lt;br /&gt;
        other = self&lt;br /&gt;
    end&lt;br /&gt;
    if base then&lt;br /&gt;
        if type( other ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            other = Meta.fiat( other )&lt;br /&gt;
        end&lt;br /&gt;
        if type( other ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            r = Private.flow( base, other )&lt;br /&gt;
            if r  and  type( assert ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                local trsl = { lt     = &amp;quot;&amp;lt;&amp;quot;,&lt;br /&gt;
                               [&amp;quot;&amp;lt;&amp;quot;]  = &amp;quot;&amp;lt;&amp;quot;,&lt;br /&gt;
                               le     = &amp;quot;&amp;lt;=&amp;quot;,&lt;br /&gt;
                               [&amp;quot;&amp;lt;=&amp;quot;] = &amp;quot;&amp;lt;=&amp;quot;,&lt;br /&gt;
                               eq     = &amp;quot;=&amp;quot;,&lt;br /&gt;
                               [&amp;quot;==&amp;quot;] = &amp;quot;=&amp;quot;,&lt;br /&gt;
                               ne     = &amp;quot;&amp;lt;&amp;gt;&amp;quot;,&lt;br /&gt;
                               [&amp;quot;&amp;lt;&amp;gt;&amp;quot;] = &amp;quot;&amp;lt;&amp;gt;&amp;quot;,&lt;br /&gt;
                               [&amp;quot;~=&amp;quot;] = &amp;quot;&amp;lt;&amp;gt;&amp;quot;,&lt;br /&gt;
                               ge     = &amp;quot;&amp;gt;=&amp;quot;,&lt;br /&gt;
                               [&amp;quot;&amp;gt;=&amp;quot;] = &amp;quot;&amp;gt;=&amp;quot;,&lt;br /&gt;
                               [&amp;quot;=&amp;gt;&amp;quot;] = &amp;quot;&amp;gt;=&amp;quot;,&lt;br /&gt;
                               gt     = &amp;quot;&amp;gt;&amp;quot;,&lt;br /&gt;
                               [&amp;quot;&amp;gt;&amp;quot;]  = &amp;quot;&amp;gt;&amp;quot; }&lt;br /&gt;
                local same = trsl[ assert:lower() ]&lt;br /&gt;
                if same then&lt;br /&gt;
                    local s = &amp;quot;=&amp;quot;&lt;br /&gt;
                    if r &amp;lt; 0 then&lt;br /&gt;
                        s = &amp;quot;&amp;lt;&amp;quot;&lt;br /&gt;
                    elseif r &amp;gt; 0 then&lt;br /&gt;
                        s = &amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                    r = ( same:find( s, 1, true )  ~=  nil )&lt;br /&gt;
                else&lt;br /&gt;
                    r = nil&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.flow()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.format = function ( self, ask, adapt )&lt;br /&gt;
    -- Format object as string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self   -- table, with numbers etc.&lt;br /&gt;
    --     ask    -- string, format spec, or nil&lt;br /&gt;
    --               table, with multiple formats&lt;br /&gt;
    --               string may contain multiple formats joined by &amp;quot;|||&amp;quot;&lt;br /&gt;
    --     adapt  -- table, with options, or nil&lt;br /&gt;
    --               .lang    -- string, with particular language code&lt;br /&gt;
    --               .london  -- true: UTC output; default: local&lt;br /&gt;
    --               .lonely  -- true: permit lonely hour&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, or false, if invalid, or number for julian date&lt;br /&gt;
    local r&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local s = type( ask )&lt;br /&gt;
        local poly&lt;br /&gt;
        if s == &amp;quot;string&amp;quot;  and  ask:find( &amp;quot;|||&amp;quot;, 1, true ) then&lt;br /&gt;
            poly = mw.text.split( ask, &amp;quot;|||&amp;quot; )&lt;br /&gt;
        elseif s == &amp;quot;table&amp;quot; then&lt;br /&gt;
            poly = ask&lt;br /&gt;
        end&lt;br /&gt;
        if poly then&lt;br /&gt;
            r = &amp;quot;&amp;quot;&lt;br /&gt;
            for i = 1, #poly do&lt;br /&gt;
                r = r .. Private.field( self, poly[ i ], adapt )&lt;br /&gt;
            end -- for i&lt;br /&gt;
        else&lt;br /&gt;
            r = Private.field( self, ask, adapt )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r  or  false&lt;br /&gt;
end -- Prototypes.format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.full = function ( self )&lt;br /&gt;
    -- Retrieve month name in current language&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, to be evaluated&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, if defined;  false, if not&lt;br /&gt;
    local r&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot;  and  self.month then&lt;br /&gt;
        local slang = ( self.lang or World.slang )&lt;br /&gt;
        r = World.monthsLong[ slang ]&lt;br /&gt;
        if r then&lt;br /&gt;
            r = r[ self.month ]&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.full()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.future = function ( self, add, allocate )&lt;br /&gt;
    -- Relative move by interval&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self      -- table, to be used as base&lt;br /&gt;
    --     add       -- string or number, to be added&lt;br /&gt;
    --     allocate  -- true, if a clone shall be returned&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, with shift&lt;br /&gt;
    local r, raw, rel, shift&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r     = self&lt;br /&gt;
        shift = add&lt;br /&gt;
    elseif type( add ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r     = add&lt;br /&gt;
        shift = self&lt;br /&gt;
    end&lt;br /&gt;
    if r then&lt;br /&gt;
        if r[ Meta.signature ] then&lt;br /&gt;
            raw = r[ Meta.signature ]&lt;br /&gt;
        else&lt;br /&gt;
            raw = r&lt;br /&gt;
        end&lt;br /&gt;
        if type( shift ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            rel = shift&lt;br /&gt;
        else&lt;br /&gt;
            rel = Private.future( shift )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if raw and rel then&lt;br /&gt;
        if allocate then&lt;br /&gt;
            r   = Prototypes.clone( r )&lt;br /&gt;
            raw = r[ Meta.signature ]&lt;br /&gt;
        end&lt;br /&gt;
        for k, v in pairs( rel ) do&lt;br /&gt;
            raw[ k ] = ( raw[ k ] or 0 )  +  v&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        Calc.fair( raw )&lt;br /&gt;
        r[ Meta.signature ] = raw&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.future()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.tostring = function ( self )&lt;br /&gt;
    -- Stringify yourself&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, to be stringified&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local dels = { false, &amp;quot;&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;-&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;:&amp;quot;, &amp;quot;:&amp;quot;, &amp;quot;.&amp;quot;, &amp;quot;&amp;quot; }&lt;br /&gt;
    local wids = { false, 4,  2,   2,   2,  2,  2,   2,   3,  3  }&lt;br /&gt;
    local s    = &amp;quot;&amp;quot;&lt;br /&gt;
    local n, r, spec&lt;br /&gt;
    local f = function ( a )&lt;br /&gt;
                  n = self[ Meta.order[ a ] ]&lt;br /&gt;
                  s = s .. dels[ a ]&lt;br /&gt;
                  if n then&lt;br /&gt;
                      spec = string.format( &amp;quot;%%s%%0%dd&amp;quot;, wids[ a ] )&lt;br /&gt;
                      s    = string.format( spec, s, n )&lt;br /&gt;
                  end&lt;br /&gt;
              end -- f()&lt;br /&gt;
    for i = 2, 5 do&lt;br /&gt;
        f( i )&lt;br /&gt;
    end -- for i&lt;br /&gt;
    r = s&lt;br /&gt;
    s = &amp;quot;&amp;quot;&lt;br /&gt;
    for i = 6, 10 do&lt;br /&gt;
        f( i )&lt;br /&gt;
    end -- for i&lt;br /&gt;
    if s == &amp;quot;::.&amp;quot; then&lt;br /&gt;
        r = r:gsub( &amp;quot;%-+$&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
    else&lt;br /&gt;
        if r == &amp;quot;--&amp;quot; then&lt;br /&gt;
            r = s&lt;br /&gt;
        else&lt;br /&gt;
            r = string.format( &amp;quot;%sT%s&amp;quot;, r, s )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    r = r:gsub( &amp;quot;%.$&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
    if self.bc then&lt;br /&gt;
        if self.year then&lt;br /&gt;
            r = &amp;quot;-&amp;quot; .. r&lt;br /&gt;
        else&lt;br /&gt;
            r = r .. &amp;quot; BC&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Prototypes.tostring()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Prototypes.valueOf = function ( self )&lt;br /&gt;
    -- Returns yourselves primitive value (primitive table)&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     self  -- table, to be dumped&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     table, or false&lt;br /&gt;
    local r&lt;br /&gt;
    if type( self ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = self[ Meta.signature ]&lt;br /&gt;
    end&lt;br /&gt;
    return r or false&lt;br /&gt;
end -- Prototypes.valueOf()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Templates.flow = function ( frame, action )&lt;br /&gt;
    -- Comparison invokation&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     frame  -- object&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string, either &amp;quot;&amp;quot; or &amp;quot;1&amp;quot;&lt;br /&gt;
    local r&lt;br /&gt;
    local s1 = frame.args[ 1 ]&lt;br /&gt;
    local s2 = frame.args[ 2 ]&lt;br /&gt;
    if s1 then&lt;br /&gt;
        s1 = mw.text.trim( s1 )&lt;br /&gt;
        if s1 == &amp;quot;&amp;quot; then&lt;br /&gt;
            s1 = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if s2 then&lt;br /&gt;
        s2 = mw.text.trim( s2 )&lt;br /&gt;
        if s2 == &amp;quot;&amp;quot; then&lt;br /&gt;
            s2 = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if s1 or s2 then&lt;br /&gt;
        local l&lt;br /&gt;
        Frame = frame&lt;br /&gt;
        l, r = pcall( Prototypes.flow,&lt;br /&gt;
                      Meta.fiat( s1 ), s2, action )&lt;br /&gt;
        if r == true then&lt;br /&gt;
            r = &amp;quot;1&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- Templates.flow()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
World.templates.formatter = function ( assigned, ask, adapt )&lt;br /&gt;
    -- Retrieve format specification string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assigned  -- table, with numbers etc.&lt;br /&gt;
    --     ask       -- string, format spec, or nil&lt;br /&gt;
    --     adapt     -- table, with options&lt;br /&gt;
    --                  .lang    -- string, with particular language code&lt;br /&gt;
    --                  .lonely  -- true: permit lonely hour&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     1  -- string&lt;br /&gt;
    --     2  -- string or nil; append suffix (zone)&lt;br /&gt;
    local r1, r2&lt;br /&gt;
    if not ask  or  ask == &amp;quot;&amp;quot; then&lt;br /&gt;
        r1 = &amp;quot;c&amp;quot;&lt;br /&gt;
    elseif ask == &amp;quot;*&amp;quot; then&lt;br /&gt;
        if World.present then&lt;br /&gt;
            if assigned.hour then&lt;br /&gt;
                if assigned.dom or assigned.month or assigned.year then&lt;br /&gt;
                    if World.present.both and&lt;br /&gt;
                       World.present.date and&lt;br /&gt;
                       World.present.time then&lt;br /&gt;
                        r1 = World.present.both&lt;br /&gt;
                                     :gsub( &amp;quot;$date&amp;quot;, World.present.date )&lt;br /&gt;
                                     :gsub( &amp;quot;$time&amp;quot;, World.present.time )&lt;br /&gt;
                    else&lt;br /&gt;
                        r1 = World.present.date&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                r1 = r1 or World.present.time&lt;br /&gt;
            else&lt;br /&gt;
                r1 = World.present.date&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        r1 = r1 or &amp;quot;c&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        local template = World.templates[ ask ]&lt;br /&gt;
        r1 = ask&lt;br /&gt;
        if not template then&lt;br /&gt;
            local slang = ( adapt.lang or assigned.lang or World.slang )&lt;br /&gt;
            local tmp   = World.templates[ slang ]&lt;br /&gt;
            if tmp then&lt;br /&gt;
                template = tmp[ ask ]&lt;br /&gt;
            end&lt;br /&gt;
            if not template then&lt;br /&gt;
                local i = slang:find( &amp;quot;-&amp;quot;, 3, true )&lt;br /&gt;
                if i then&lt;br /&gt;
                    slang = slang:sub( 1,  i - 1 ):lower()&lt;br /&gt;
                    tmp   = World.templates[ slang ]&lt;br /&gt;
                    if tmp then&lt;br /&gt;
                        template = tmp[ ask ]&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( template ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            local low = ( ask == &amp;quot;ISO&amp;quot; or ask == &amp;quot;ISO-T&amp;quot; )&lt;br /&gt;
            r1 = template.spec&lt;br /&gt;
            if assigned.year then&lt;br /&gt;
                if not assigned.dom then&lt;br /&gt;
                    r1 = r1:gsub( &amp;quot;[ .%-]?[dDjlNwz][ .,%-]*&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                           :gsub( &amp;quot;^&amp;amp;#160;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                    if not assigned.month then&lt;br /&gt;
                        r1 = r1:gsub( &amp;quot;[ .%-]?[FmMnt][ .%-]*&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                r1 = r1:gsub( &amp;quot; ?[yY] ?&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                if not assigned.dom then&lt;br /&gt;
                     r1 = r1:gsub( &amp;quot;[ .]?[dDjlNwz][ .,%-]*&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                            :gsub( &amp;quot;^&amp;amp;#160;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if template.lift and&lt;br /&gt;
               ( assigned.dom or&lt;br /&gt;
                 not  ( assigned.month or assigned.year or assigned.bc )&lt;br /&gt;
               ) then&lt;br /&gt;
                local stamp = false&lt;br /&gt;
                if assigned.hour then&lt;br /&gt;
                    if assigned.min then&lt;br /&gt;
                        stamp = &amp;quot;H:i&amp;quot;&lt;br /&gt;
                        if assigned.sec then&lt;br /&gt;
                            stamp = &amp;quot;H:i:s&amp;quot;&lt;br /&gt;
                            if assigned.msec then&lt;br /&gt;
                                stamp = string.format( &amp;quot;%s.%03d&amp;quot;,&lt;br /&gt;
                                                       stamp,&lt;br /&gt;
                                                       assigned.msec )&lt;br /&gt;
                                if assigned.mysec then&lt;br /&gt;
                                    stamp = string.format( &amp;quot;%s.%03d&amp;quot;,&lt;br /&gt;
                                                           stamp,&lt;br /&gt;
                                                         assigned.mysec )&lt;br /&gt;
                                end&lt;br /&gt;
                            end&lt;br /&gt;
                        end&lt;br /&gt;
                    elseif adapt.lonely then&lt;br /&gt;
                        stamp = &amp;quot;H&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
                if low or ask:find( &amp;quot;hh:mm:ss&amp;quot;, 1, true ) then&lt;br /&gt;
                    if stamp then&lt;br /&gt;
                        r1 = string.format( &amp;quot;%s %s&amp;quot;, r1, stamp )&lt;br /&gt;
                    end&lt;br /&gt;
                elseif ask:find( &amp;quot;hh:mm&amp;quot;, 1, true )  and&lt;br /&gt;
                       stamp  and&lt;br /&gt;
                       #stamp &amp;gt; 3 then&lt;br /&gt;
                    r1 = string.format( &amp;quot;%s H:i&amp;quot;, r1 )&lt;br /&gt;
                end&lt;br /&gt;
                if stamp then&lt;br /&gt;
                    if low or template.long then&lt;br /&gt;
                        local scheme&lt;br /&gt;
                        if template.long then&lt;br /&gt;
                            scheme = mw.language.getContentLanguage()&lt;br /&gt;
                            scheme = scheme.code&lt;br /&gt;
                        end&lt;br /&gt;
                        r2 = World.zones.formatter( assigned, scheme )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if type ( assigned.bc ) == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                local eras = World.era[ adapt.lang ]  or  World.era.en&lt;br /&gt;
                local i&lt;br /&gt;
                if not r2 then&lt;br /&gt;
                    r2 = &amp;quot;&amp;quot;&lt;br /&gt;
                end&lt;br /&gt;
                if assigned.bc then&lt;br /&gt;
                    i = 1&lt;br /&gt;
                else&lt;br /&gt;
                    i = 2&lt;br /&gt;
                end&lt;br /&gt;
                r2 = string.format( &amp;quot;%s&amp;amp;#160;%s&amp;quot;, r2, eras[ i ] )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r1, r2&lt;br /&gt;
end -- World.templates.formatter()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
World.zones.formatter =  function ( assigned, align )&lt;br /&gt;
    -- Retrieve time zone specification string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     assigned  -- table, with numbers etc.&lt;br /&gt;
    --                  .zone should be available&lt;br /&gt;
    --     align     -- string, format spec, or nil&lt;br /&gt;
    --                  nil, false, &amp;quot;+-&amp;quot;  -- +/- 0000&lt;br /&gt;
    --                  &amp;quot;Z&amp;quot;               -- single letter&lt;br /&gt;
    --                  &amp;quot;UTC&amp;quot;             -- &amp;quot;UTC&amp;quot;, if appropriate&lt;br /&gt;
    --                  &amp;quot;de&amp;quot;              -- try localized&lt;br /&gt;
    -- Returns:&lt;br /&gt;
    --     string&lt;br /&gt;
    local r    = &amp;quot;&amp;quot;&lt;br /&gt;
    local move = 0&lt;br /&gt;
    if assigned.zone then&lt;br /&gt;
        local s = type( assigned.zone )&lt;br /&gt;
        if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
            s = assigned.zone:upper()&lt;br /&gt;
            if #s == 1 then&lt;br /&gt;
                -- &amp;quot;YXWVUTSRQPONZABCDEFGHIKLM&amp;quot;&lt;br /&gt;
                move = World.zones[ &amp;quot;!&amp;quot; ]:find( s, 1, true )&lt;br /&gt;
                if move then&lt;br /&gt;
                    move          = ( move - 13 ) * 100&lt;br /&gt;
                    assigned.zone = move&lt;br /&gt;
                else&lt;br /&gt;
                    assigned.zone = false&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                local code = World.zones[ s ]&lt;br /&gt;
                if not code then&lt;br /&gt;
                   local slang = ( assigned.lang or&lt;br /&gt;
                                   World.slang )&lt;br /&gt;
                   local tmp   = World.zones[ slang ]&lt;br /&gt;
                   if tmp then&lt;br /&gt;
                       code = tmp[ s ]&lt;br /&gt;
                   end&lt;br /&gt;
                   if not code  and&lt;br /&gt;
                      slang ~= &amp;quot;en&amp;quot;  and&lt;br /&gt;
                      World.zones.en then&lt;br /&gt;
                       code = World.zones.en[ s ]&lt;br /&gt;
                   end&lt;br /&gt;
                end&lt;br /&gt;
                if code then&lt;br /&gt;
                    move          = code&lt;br /&gt;
                    assigned.zone = move&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        elseif s == &amp;quot;number&amp;quot; then&lt;br /&gt;
            move = assigned.zone&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if move then&lt;br /&gt;
        local spec = &amp;quot;+-&amp;quot;&lt;br /&gt;
        if align then&lt;br /&gt;
            if align == &amp;quot;Z&amp;quot; then&lt;br /&gt;
                if move % 100 == 0 then&lt;br /&gt;
                    r = World.zones[ &amp;quot;!&amp;quot; ]:sub( move / 100 + 13,  1 )&lt;br /&gt;
                    spec = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif align ~= &amp;quot;+-&amp;quot; then&lt;br /&gt;
                if move == 0 then&lt;br /&gt;
                    r    = &amp;quot; UTC&amp;quot;&lt;br /&gt;
                    spec = false&lt;br /&gt;
                else&lt;br /&gt;
                    local part = World.zones[ align ]&lt;br /&gt;
                    if part then&lt;br /&gt;
                        for k, v in pairs( part ) do&lt;br /&gt;
                            if v == move then&lt;br /&gt;
                                r    = string.format( &amp;quot; (%s)&amp;quot;, k )&lt;br /&gt;
                                spec = false&lt;br /&gt;
                                break&lt;br /&gt;
                            end&lt;br /&gt;
                        end -- for k, v&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if spec == &amp;quot;+-&amp;quot; then&lt;br /&gt;
            if move &amp;lt; 0 then&lt;br /&gt;
                spec = &amp;quot;%4.4d&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                spec = &amp;quot;+%4.4d&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( spec, move )&lt;br /&gt;
            r = string.format( &amp;quot;%s:%s&amp;quot;,&lt;br /&gt;
                               r:sub( 1, 3), r:sub( 4 ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- World.zones.formatter()&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.test = function ( args, alien )&lt;br /&gt;
    local slang = args.lang or alien&lt;br /&gt;
    local obj   = Meta.fiat( args[ 1 ], false, args.shift )&lt;br /&gt;
    local r&lt;br /&gt;
    if type( obj ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local spec  = args[ 2 ]&lt;br /&gt;
        local opt&lt;br /&gt;
        if spec then&lt;br /&gt;
            spec = mw.text.trim( spec )&lt;br /&gt;
        end&lt;br /&gt;
        if slang then&lt;br /&gt;
            opt = { lang = mw.text.trim( slang ) }&lt;br /&gt;
        end&lt;br /&gt;
        r = obj:format( spec, opt )&lt;br /&gt;
    else&lt;br /&gt;
        r = ( args.noerror or &amp;quot;0&amp;quot; )&lt;br /&gt;
        if r == &amp;quot;0&amp;quot; then&lt;br /&gt;
            r = fault( &amp;quot;Format invalid&amp;quot; )&lt;br /&gt;
        else&lt;br /&gt;
            r = &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if args.errCat then&lt;br /&gt;
            local cats = mw.text.split( args.errCat, &amp;quot;%s*|%s*&amp;quot; )&lt;br /&gt;
            for i = 1, #cats do&lt;br /&gt;
                r = string.format( &amp;quot;%s[[Category:%s]]&amp;quot;,  r,  cats[ i ] )&lt;br /&gt;
            end -- for i&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.test&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local r, 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 = 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 Prototypes.failsafe( false, since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.format = function ( frame )&lt;br /&gt;
    --    1       -- stamp&lt;br /&gt;
    --    2       -- spec&lt;br /&gt;
    --    lang&lt;br /&gt;
    --    shift&lt;br /&gt;
    --    noerror&lt;br /&gt;
    local l, r&lt;br /&gt;
    local v = { frame.args[ 1 ],&lt;br /&gt;
                frame.args[ 2 ],&lt;br /&gt;
                shift   = frame.args.shift,&lt;br /&gt;
                noerror = frame.args.noerror,&lt;br /&gt;
                errCat  = frame.args.errCat }&lt;br /&gt;
    if not v[ 1 ]  or  v[ 1 ] == &amp;quot;now&amp;quot; then&lt;br /&gt;
        v[ 1 ]  = frame:callParserFunction( &amp;quot;#timel&amp;quot;, &amp;quot;c&amp;quot;, v.shift )&lt;br /&gt;
        v.shift = false&lt;br /&gt;
    end&lt;br /&gt;
    Frame  = frame&lt;br /&gt;
    l, r = pcall( p.test,  v,  frame.args[ 3 ] or frame.args.lang )&lt;br /&gt;
    if not l then&lt;br /&gt;
        r = fault( r )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- p.format&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.lt = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;lt&amp;quot; )&lt;br /&gt;
end -- p.lt&lt;br /&gt;
p.le = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;le&amp;quot; )&lt;br /&gt;
end -- p.le&lt;br /&gt;
p.eq = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;eq&amp;quot; )&lt;br /&gt;
end -- p.eq&lt;br /&gt;
p.ne = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;ne&amp;quot; )&lt;br /&gt;
end -- p.ne&lt;br /&gt;
p.ge = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;ge&amp;quot; )&lt;br /&gt;
end -- p.ge&lt;br /&gt;
p.gt = function ( frame )&lt;br /&gt;
    return Templates.flow( frame, &amp;quot;gt&amp;quot; )&lt;br /&gt;
end -- p.gt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.DateTime = function ()&lt;br /&gt;
    return DateTime&lt;br /&gt;
end -- p.DateTime&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ZuS&amp;diff=378</id>
		<title>Vorlage:ZuS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ZuS&amp;diff=378"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=zu|SCRIPTING=Latn|SERVICE=[[isiZulu|zulu]]|SOLE=[[isiZulu]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=zu|SPRACHE=isiZulu|EXAMPLE=kwaNogqaza}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitatvorlage&amp;diff=376</id>
		<title>Vorlage:Zitatvorlage</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitatvorlage&amp;diff=376"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;Diese Vorlage dient der Auszeichnung von [[Zitat]]en{{#ifeq:{{{block|?}}}|1||, teilweise}} als [[Blockzitat]]. Auch bei Verwendung der Vorlage bleiben die [[Wikipedia:Zitate|Grundsätze des Zitierens]] zu beachten, insbesondere des sparsamen Zitierens, des nötigen Zitierzweckes und der [[Zitat#Zitate und Urheberrecht|Beschränkungen durch das Urheberrecht]], die ein Zitat nur dann erlauben, wenn es inhaltlich und vom Umfang her angemessen ''in eine eigene schöpferische Leistung eingebettet'' ist, also einen eigenen urheberrechtlich schutzwürdigen Text und Gedankengang, der durch das Zitat lediglich erläutert, untermauert oder veranschaulicht wird oder anderweitig darauf Bezug nimmt.&lt;br /&gt;
&lt;br /&gt;
Somit ist jede kommentarlose Verwendung von Zitaten unerlaubt, obwohl sie oft geschieht, zum Beispiel bei der Verwendung von [[Rezension]]en als Blockzitat.&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Vorlage:Einleitung]]&lt;br /&gt;
[[Kategorie:Vorlage:Metadokumentation]]&lt;br /&gt;
[[Kategorie:Vorlage:für Vorlagen]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/XML&amp;diff=374</id>
		<title>Vorlage:Zitat/XML</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/XML&amp;diff=374"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;!--                                                                    --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Dies ist die XML-Beschreibung der Vorlage für den Vorlagenmeister. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- Mehr Infos unter [[Benutzer:Revvar/VM]].                           --&amp;gt;&lt;br /&gt;
&amp;lt;!--                                                                    --&amp;gt;&lt;br /&gt;
&amp;lt;?mediawiki &amp;quot;{{XML-Warnung|&amp;quot;}}&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;TemplateUsage output=&amp;quot;collapse&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;Group&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;Text&amp;quot; label=&amp;quot;Text&amp;quot; null=&amp;quot;false&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;Autor&amp;quot; label=&amp;quot;Autor&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;Quelle&amp;quot; label=&amp;quot;Quelle&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;lang&amp;quot; label=&amp;quot;Sprache&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;vor&amp;quot; label=&amp;quot;Abweichende Anführungszeichen Anfang&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;nach&amp;quot; label=&amp;quot;Abweichende Anführungszeichen Ende&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;Umschrift&amp;quot; label=&amp;quot;Umschrift&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;Übersetzung&amp;quot; label=&amp;quot;Übersetzung&amp;quot; /&amp;gt;&lt;br /&gt;
     &amp;lt;Parameter name=&amp;quot;ref&amp;quot; label=&amp;quot;Ref-Angabe mit &amp;amp;lt;ref&amp;amp;gt; und &amp;amp;lt;/ref&amp;amp;gt;&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;/Parameter&amp;gt;&lt;br /&gt;
   &amp;lt;/Group&amp;gt;&lt;br /&gt;
 &amp;lt;/TemplateUsage&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Test&amp;diff=372</id>
		<title>Vorlage:Zitat/Test</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Test&amp;diff=372"/>
		<updated>2022-02-23T14:42:25Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Dokumentation/Testseite}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Basis ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Eine Rose ist eine Rose ist eine Rose.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Eine Rose ist eine Rose ist eine Rose.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Eine Zeile.&lt;br /&gt;
&lt;br /&gt;
Andere Zeile.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Eine Zeile.&lt;br /&gt;
&lt;br /&gt;
Andere Zeile.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Wort. {{Kapitälchen|Kapitälchen}}. Wort.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Wort. {{Kapitälchen|Kapitälchen}}. Wort.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text={{Kapitälchen|Kapitälchen}}. Wort.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text={{Kapitälchen|Kapitälchen}}. Wort.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text={{Kapitälchen|Zeile.&amp;lt;br /&amp;gt;&lt;br /&gt;
Andere Zeile.}} Wort.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text={{Kapitälchen|Zeile.&amp;lt;br /&amp;gt;&lt;br /&gt;
Andere Zeile.}} Wort.}}&lt;br /&gt;
&lt;br /&gt;
== Sprachen, vor/nach ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Code is poetry.&lt;br /&gt;
 |Sprache=en}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Code is poetry.&lt;br /&gt;
 |Sprache=en}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Code is poetry.&lt;br /&gt;
 |lang=en}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Code is poetry.&lt;br /&gt;
 |lang=en}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Hopp Schwyz&lt;br /&gt;
 |lang=de-CH}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Hopp Schwyz&lt;br /&gt;
 |lang=de-CH}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Vorher – Nachher&lt;br /&gt;
 |vor=&amp;amp;lt;&lt;br /&gt;
 |nach=&amp;amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Vorher – Nachher&lt;br /&gt;
 |vor=&amp;amp;lt;&lt;br /&gt;
 |nach=&amp;amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=An der Nase rumgeführt.&lt;br /&gt;
 |vor=-&lt;br /&gt;
 |nach=-}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=An der Nase rumgeführt.&lt;br /&gt;
 |vor=-&lt;br /&gt;
 |nach=-}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Die Katze läuft im Schnee.&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN&amp;quot;&amp;gt;name=&amp;quot;EN&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Die Katze läuft im Schnee.&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN&amp;quot;&amp;gt;name=&amp;quot;EN&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Autor Quelle Umschrift Übersetzung ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Autor=Oller Grieche}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Autor=Oller Grieche}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Quelle=Olle Klamotte}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Quelle=Olle Klamotte}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Latn=abgd&lt;br /&gt;
 |de=alpha beta gamma delta}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Latn=abgd&lt;br /&gt;
 |de=alpha beta gamma delta}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN2&amp;quot;&amp;gt;name=&amp;quot;EN2&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN2&amp;quot;&amp;gt;name=&amp;quot;EN2&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Autor=Oller Grieche&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN3&amp;quot;&amp;gt;name=&amp;quot;EN3&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Autor=Oller Grieche&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN3&amp;quot;&amp;gt;name=&amp;quot;EN3&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Quelle=Olle Klamotte&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN4&amp;quot;&amp;gt;name=&amp;quot;EN4&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Quelle=Olle Klamotte&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN4&amp;quot;&amp;gt;name=&amp;quot;EN4&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN5&amp;quot;&amp;gt;name=&amp;quot;EN5&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN5&amp;quot;&amp;gt;name=&amp;quot;EN5&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN6&amp;quot;&amp;gt;name=&amp;quot;EN6&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN6&amp;quot;&amp;gt;name=&amp;quot;EN6&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN7&amp;quot;&amp;gt;name=&amp;quot;EN7&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Umschrift=abgd&lt;br /&gt;
 |Übersetzung=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN7&amp;quot;&amp;gt;name=&amp;quot;EN7&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Latn=abgd&lt;br /&gt;
 |de=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN8&amp;quot;&amp;gt;name=&amp;quot;EN8&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=αβγδ&lt;br /&gt;
 |lang=el&lt;br /&gt;
 |Latn=abgd&lt;br /&gt;
 |de=alpha beta gamma delta&lt;br /&gt;
 |ref=&amp;lt;ref name=&amp;quot;EN8&amp;quot;&amp;gt;name=&amp;quot;EN8&amp;quot;&amp;lt;/ref&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
== Unbenannte Parameter ==&lt;br /&gt;
Zitat ohne Autor und Quelle:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.}}&lt;br /&gt;
&lt;br /&gt;
Zitat mit Autor:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|Goethe}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|Goethe}}&lt;br /&gt;
&lt;br /&gt;
Zitat mit Autor und Werk:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|Goethe|''Faust: der Tragödie erster Teil''}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|Goethe|''Faust: der Tragödie erster Teil''}}&lt;br /&gt;
&lt;br /&gt;
Zitat ohne Autor und mit Quelle:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Du hast keine Chance – nutze Sie!|Quelle=[[Sponti-Spruch]]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Du hast keine Chance – nutze Sie!|3=[[Sponti-Spruch]]}}&amp;lt;/nowiki&amp;gt; (alternativ)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Du hast keine Chance – nutze Sie!||[[Sponti-Spruch]]}}&amp;lt;/nowiki&amp;gt; (alternativ)&lt;br /&gt;
&lt;br /&gt;
{{Zitat|Du hast keine Chance – nutze Sie!|Quelle=[[Sponti-Spruch]]}}&lt;br /&gt;
&lt;br /&gt;
Wikimarkup kann natürlich auch benutzt werden:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|[[Johann Wolfgang von Goethe|Goethe]]|''Faust: der Tragödie erster Teil''}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Zitat|Zwei Seelen wohnen, ach, in meiner Brust.|[[Johann Wolfgang von Goethe|Goethe]]|''Faust: der Tragödie erster Teil''}}&lt;br /&gt;
&lt;br /&gt;
Ein etwas längeres Beispiel&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Zitat|Durch viele Zitate vermehrt man seinen Anspruch auf&lt;br /&gt;
Gelehrsamkeit, vermindert aber den auf Originalität,&lt;br /&gt;
und was ist Gelehrsamkeit ohne Originalität! Man soll&lt;br /&gt;
sie also nur gebrauchen, wo man fremder Autorität&lt;br /&gt;
wirklich bedarf.|Arthur Schopenhauer}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Zitat|Durch viele Zitate vermehrt man seinen Anspruch auf&lt;br /&gt;
Gelehrsamkeit, vermindert aber den auf Originalität,&lt;br /&gt;
und was ist Gelehrsamkeit ohne Originalität! Man soll&lt;br /&gt;
sie also nur gebrauchen, wo man fremder Autorität&lt;br /&gt;
wirklich bedarf.|Arthur Schopenhauer}}&lt;br /&gt;
&lt;br /&gt;
== Unbenannt, knapp ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat|Eine Rose ist eine Rose ist eine Rose.&lt;br /&gt;
|lang=de}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat|Eine Rose ist eine Rose ist eine Rose.&lt;br /&gt;
|lang=de}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat|Eine Zeile.&lt;br /&gt;
&lt;br /&gt;
Andere Zeile.&lt;br /&gt;
|lang=de}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat|Eine Zeile.&lt;br /&gt;
&lt;br /&gt;
Andere Zeile.&lt;br /&gt;
|lang=de}}&lt;br /&gt;
&lt;br /&gt;
== Fehler ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Vorn ohne hinten&lt;br /&gt;
 |vor=@}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Vorn ohne hinten&lt;br /&gt;
 |vor=@}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Hinten ohne vorn&lt;br /&gt;
 |nach=@}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Hinten ohne vorn&lt;br /&gt;
 |nach=@}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=An der Nase rumgeführt.&lt;br /&gt;
 |ref=Ich bin kein ref.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=An der Nase rumgeführt.&lt;br /&gt;
 |ref=Ich bin kein ref.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=1 + Text&lt;br /&gt;
 |1=da capo}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=1 + Text&lt;br /&gt;
 |1=da capo}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=2 + Autor&lt;br /&gt;
 |Autor=Urheber&lt;br /&gt;
 |2=von und zu G.}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=2 + Autor&lt;br /&gt;
 |Autor=Urheber&lt;br /&gt;
 |2=von und zu G.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=3 + Quelle&lt;br /&gt;
 |Quelle=Original&lt;br /&gt;
 |3=Plagiat}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=3 + Quelle&lt;br /&gt;
 |Quelle=Original&lt;br /&gt;
 |3=Plagiat}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Umschrift + Latn&lt;br /&gt;
 |lang=und&lt;br /&gt;
 |Umschrift=Klarname&lt;br /&gt;
 |Latn=ISO}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Umschrift + Latn&lt;br /&gt;
 |lang=und&lt;br /&gt;
 |Umschrift=Klarname&lt;br /&gt;
 |Latn=ISO}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Übersetzung + de&lt;br /&gt;
 |de=ISO&lt;br /&gt;
 |Übersetzung=Klarname}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=Übersetzung + de&lt;br /&gt;
 |de=ISO&lt;br /&gt;
 |Übersetzung=Klarname}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=lang + Sprache&lt;br /&gt;
 |lang=de-CH&lt;br /&gt;
 |Sprache=de-CH}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=lang + Sprache&lt;br /&gt;
 |lang=de-CH&lt;br /&gt;
 |Sprache=de-CH}}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Editnotice&amp;diff=370</id>
		<title>Vorlage:Zitat/Editnotice</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Editnotice&amp;diff=370"/>
		<updated>2022-02-23T14:42:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Dokumentation/Editnoticeseite}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{Tausendfach verwendet}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Doku&amp;diff=368</id>
		<title>Vorlage:Zitat/Doku</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Zitat/Doku&amp;diff=368"/>
		<updated>2022-02-23T14:42:24Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Dokumentation/Dokuseite}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
{{TemplateData|JSON=&lt;br /&gt;
{{TemplateData/JSON&lt;br /&gt;
 |Beschreibung=Formatierung von zitierten Textpassagen als [[Blockzitat]]&lt;br /&gt;
 |Parameter=&lt;br /&gt;
   {{TemplateData/Parameter|Text&lt;br /&gt;
     |Beschreibung=Zitat&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=ja&lt;br /&gt;
     |Aliasse={{TemplateData/Aliasse|1}}&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|Sprache&lt;br /&gt;
     |Beschreibung=Code nach RFC 5645 bzw. [[ISO 639]] für eine Fremdsprache, in der das Original verfasst ist&amp;lt;exportonly&amp;gt;. Das wäre etwa: „en“ für englisch, „fr“ für französisch usw.&amp;lt;/exportonly&amp;gt;&lt;br /&gt;
     |Typ=line&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
     |Werte={{TemplateData/Werte&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|en}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|en|US}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|en|GB}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|fr}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|la}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|de|AT}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|de|CH}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|az}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|be}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|bg}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|br}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|bs}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|bug}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ca}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|cs}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|cu}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|cy}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|da}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|dz}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|el}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|es}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|et}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|fi}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|fj}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|frr}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|fur}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|gl}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|gmh}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|grc}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|gsw}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|hr}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|hu}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|hy}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|id}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|is}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|it}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ka}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|kk}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ko}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ksh}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|lt}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|lv}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|mt}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ms}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|nb}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|nds}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|nl}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|nn}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|no}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|pl}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|pt}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|rm}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ro}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ru}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|sa}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|sk}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|smi}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|sq}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|sr}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|st}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|sv}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|th}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|tr}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|uk}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|vec}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|vi}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|zu}}&lt;br /&gt;
            }}&lt;br /&gt;
     |Vorgabe=deutschsprachig&lt;br /&gt;
     |Beispiel=en-US&lt;br /&gt;
     |Aliasse={{TemplateData/Aliasse|lang}}&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|Autor&lt;br /&gt;
     |Beschreibung=Autoren (Vorname Nachname, Vorname Nachname&amp;amp;nbsp;…)&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
     |Empfohlen=ja&lt;br /&gt;
     |Beispiel=Heinrich Heine&lt;br /&gt;
     |Aliasse={{TemplateData/Aliasse|2}}&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|Quelle&lt;br /&gt;
     |Beschreibung=Quelle, in der das Zitat zu finden ist&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
     |Empfohlen=ja&lt;br /&gt;
     |Beispiel=Die Harzreise&lt;br /&gt;
     |Aliasse={{TemplateData/Aliasse|3}}&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|Umschrift&lt;br /&gt;
     |Beschreibung=Umschrift/Transkription: Übertragung der Zeichen des Originalschriftsystems in die Zeichen das lateinischen Alphabets&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|Übersetzung&lt;br /&gt;
     |Beschreibung=Deutsche Übersetzung des Zitats&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|ref&lt;br /&gt;
     |Kurz=Einzelnachweis&lt;br /&gt;
     |Beschreibung=Einzelnachweis &amp;amp;lt;ref&amp;gt; (nur &amp;amp;lt;ref&amp;gt;-Elemente zulässig)&lt;br /&gt;
     |Typ=content&lt;br /&gt;
     |Pflicht=nein&lt;br /&gt;
     |Empfohlen=ja&lt;br /&gt;
     |Beispiel={{Char|60}}ref&amp;gt;''Hier steht’s!'' S. 42{{Char|60}}/ref&amp;gt;&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|vor&lt;br /&gt;
     |Beschreibung=(historisch) von planmäßigen Anführungszeichen abweichende Auszeichnungen vor dem Zitat; vermeiden&lt;br /&gt;
     |Typ=line&lt;br /&gt;
     |Veraltet=entfernen&lt;br /&gt;
   }}&lt;br /&gt;
   {{TemplateData/Parameter|nach&lt;br /&gt;
     |Beschreibung=(historisch) von planmäßigen Anführungszeichen abweichende Auszeichnungen nach dem Zitat; vermeiden&lt;br /&gt;
     |Typ=line&lt;br /&gt;
     |Veraltet=entfernen&lt;br /&gt;
   }}&lt;br /&gt;
 |Format=block indent compressed last&lt;br /&gt;
}}&lt;br /&gt;
|TOC=1}}&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ar}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|fa}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|he}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|ja}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|yi}}&lt;br /&gt;
             | {{TemplateData/JSON/val:lang|zh}}&lt;br /&gt;
--&amp;gt; &lt;br /&gt;
&lt;br /&gt;
== Hinweise ==&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{Achtung|1=[[Spezial:Diff/12156729|Seit 2006]] setzt diese Vorlage den Autorennamen in [[Kapitälchen]]. In der bis Juli 2016 aktuell gewesenen Version 51 von [[Google Chrome]] tritt in diesem Zusammenhang ein Fehler in der Behandlung des Buchstabens „[[ß]]“ auf: Der Kleinbuchstabe „ß“ wird dort durch die beiden Großbuchstaben „SS“ ersetzt, jedoch wird für jedes „ß“ in der Eingabe ein Buchstabe am Ende abgeschnitten. Dies ist ein Fehler des Webbrowsers, der bereits in Version 52 behoben wurde.&lt;br /&gt;
&lt;br /&gt;
{{{!}} class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
{{!}}+ Testfälle&lt;br /&gt;
{{!}}-&lt;br /&gt;
! Eingabe&lt;br /&gt;
! Ausgabe&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} Reissverschluss&lt;br /&gt;
{{!}} class=&amp;quot;Person&amp;quot; {{!}} Reissverschluss&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} Reißverschluss&lt;br /&gt;
{{!}} class=&amp;quot;Person&amp;quot; {{!}} Reißverschluss&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} Reißverschluß&lt;br /&gt;
{{!}} class=&amp;quot;Person&amp;quot; {{!}} Reißverschluß&lt;br /&gt;
{{!}}}&lt;br /&gt;
}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Zitatvorlage|block=1}}&lt;br /&gt;
&lt;br /&gt;
== Kopiervorlage ==&lt;br /&gt;
&lt;br /&gt;
Häufig ist die folgende Kurzform hinreichend:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=&lt;br /&gt;
 |Sprache=&lt;br /&gt;
 |Autor=&lt;br /&gt;
 |Quelle=&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Parameter:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=&lt;br /&gt;
 |Sprache=&lt;br /&gt;
 |Autor=&lt;br /&gt;
 |Quelle=&lt;br /&gt;
 |Umschrift=&lt;br /&gt;
 |Übersetzung=&lt;br /&gt;
 |vor=&lt;br /&gt;
 |nach=&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel&amp;lt;!--e --&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space:pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=That’s one small step for man … one … giant leap for mankind.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Neil Armstrong&lt;br /&gt;
 |Quelle=O-Ton&lt;br /&gt;
 |Übersetzung= Das ist ein kleiner Schritt für den Menschen … ein … riesiger Sprung für die Menschheit.&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;am [[21. Juli]] [[1969]] betrat [[Neil Armstrong]] als erster Mensch im Rahmen des [[Apollo-Programm]]s der [[NASA]] den [[Mond]] ([[:Datei:Neil Armstrong small step.wav|O-Ton]] von [http://science.ksc.nasa.gov/history/apollo/apollo-11/apollo-11-info.html science.ksc.nasa.gov])&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text=That’s one small step for man … one … giant leap for mankind.&lt;br /&gt;
 |Sprache=en&lt;br /&gt;
 |Autor=Neil Armstrong&lt;br /&gt;
 |Quelle=O-Ton&lt;br /&gt;
 |Übersetzung= Das ist ein kleiner Schritt für den Menschen … ein … riesiger Sprung für die Menschheit.&lt;br /&gt;
 |ref=&amp;lt;ref&amp;gt;am [[21. Juli]] [[1969]] betrat [[Neil Armstrong]] als erster Mensch im Rahmen des [[Apollo-Programm]]s der [[NASA]] den [[Mond]] ([[:Datei:Neil Armstrong small step.wav|O-Ton]] von [http://science.ksc.nasa.gov/history/apollo/apollo-11/apollo-11-info.html science.ksc.nasa.gov])&amp;lt;/ref&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
'''Einzelnachweise'''&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;pre style=&amp;quot;white-space:pre-wrap;&amp;quot;&amp;gt;&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text        = 寧我負人，毋人負我。&lt;br /&gt;
 |Sprache     = zh&lt;br /&gt;
 |Autor       = Cao Cao&lt;br /&gt;
 |Umschrift   = Nìng wǒ fù rén, wú rén fù wǒ&lt;br /&gt;
 |Übersetzung = Ich möchte lieber andere betrügen, als dass andere mich betrügen&lt;br /&gt;
 |Quelle      = Angebliches Zitat aus dem Roman ''Geschichte der Drei Reiche'', das Cao Caos Rücksichtslosigkeit unterstreichen soll&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Zitat&lt;br /&gt;
 |Text        = 寧我負人，毋人負我.&lt;br /&gt;
 |lang= zh&lt;br /&gt;
 |Autor       = Cao Cao&lt;br /&gt;
 |Umschrift   = Nìng wǒ fù rén, wú rén fù wǒ&lt;br /&gt;
 |Übersetzung = Ich möchte lieber andere betrügen, als dass andere mich betrügen&lt;br /&gt;
 |Quelle      = Angebliches Zitat aus dem Roman ''Geschichte der Drei Reiche'', das Cao Caos Rücksichtslosigkeit unterstreichen soll&lt;br /&gt;
}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vereinfachte Fremdspracheneinbindung ==&lt;br /&gt;
Früher benutzte man für Fremdsprachen jeweils eine eigene Vorlage.&lt;br /&gt;
* Inzwischen wird die Art des Anführungszeichens automatisch von der verwendeten Sprache abgeleitet.&lt;br /&gt;
* Langfristig sollen die besonderen Einzelvorlagen für einzelne Sprachen auslaufen.&lt;br /&gt;
&lt;br /&gt;
Bei den nachstehenden Sprachen wird noch mit besonderen Schriften (insbesondere rechts nach links) gearbeitet; diese können einstweilen belassen werden:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Vorlage !! Sprache / Einsatzzweck&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-ar]] || {{arS}}&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-fa]] || [[Persische Sprache|persisch]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-he]] || [[Hebräische Sprache|(neu-)hebräisch]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-ja]] || {{jaS}}&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-yi]] || {{yiS}}&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-zh-Hant]] || [[Traditionelles Chinesisch]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Vorlage:Zitat-zh]] || [[Chinesische Sprachen|chinesisch]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Für lateinische Verschriftung gibt es noch einige besondere Vorlagen, die jedoch obsolet geworden sind und gelegentlich gegen die Basisversion ausgetauscht werden können.&lt;br /&gt;
{{Dokumentation/Siehe auch |Liste=&lt;br /&gt;
* [[Vorlage:&amp;quot;]] – Zitate im Fließtext (analoge Vorlage)&lt;br /&gt;
* [[Wikipedia:Lua/Modul/Text/Test#Anführungszeichen|bekannte Anführungszeichen in Fremdsprachen]]&lt;br /&gt;
}}&lt;br /&gt;
== Wartung ==&lt;br /&gt;
{{Vorlagenfehler-Wartungskat}}&lt;br /&gt;
* Es werden Fehlermeldungen angezeigt; bis zur Aufarbeitung des Altbestands ggf. nur für Benutzer mit Sichterrechten.&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Kategorie:Vorlage:Zitieren|!]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:YiS&amp;diff=366</id>
		<title>Vorlage:YiS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:YiS&amp;diff=366"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=yi |SCRIPTING=Hebr |SERVICE=[[jiddisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/RTL/Doku |CODE=yi |SCRIPTING=Hebr |S=1 |he=1 |pl=1 |ru=1 |EXAMPLE=ייִדיש&amp;amp;lrm; |EXAMPLE-Latn=yidish |EXAMPLE-YIVO= |EXAMPLE-de=jiddisch |SieheAuch=* [[Vorlage:heS]] – {{heS}}&lt;br /&gt;
{{yi/Transkriptionen}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ViS&amp;diff=364</id>
		<title>Vorlage:ViS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ViS&amp;diff=364"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=vi|SCRIPTING=Latn|SERVICE=[[Vietnamesische Sprache|vietnamesisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=vi|SPRACHE=vietnamesischer Sprache|EXAMPLE=tiếng Việt|EXAMPLE-de=vietnamesische Sprache|EXAMPLE-en=vietnamese language}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:VecS&amp;diff=362</id>
		<title>Vorlage:VecS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:VecS&amp;diff=362"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=vec|SCRIPTING=Latn|SERVICE=[[Venetische Sprache (romanisch)|venetisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=vec|SPRACHE=venetischer Sprache [romanisch]|EXAMPLE=Provìncia de Vicènsa|SieheAuch=&lt;br /&gt;
* [[Vorlage:itS]] – {{itS}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:UkS-Cyrl&amp;diff=360</id>
		<title>Vorlage:UkS-Cyrl</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:UkS-Cyrl&amp;diff=360"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=uk|SCRIPTING=Cyrl|LONG=1|SERVICE=[[Ukrainische Sprache|ukrainisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Cyrl-nachgestellt/Doku|CODE=uk|LONG=1|SPRACHE=ukrainischer Sprache|EXAMPLE-Cyrl=Україна|EXAMPLE-Latn=Ukrajina|EXAMPLE-IPA=ukrɑˈjinɑ|EXAMPLE-de=Ukraine|EXAMPLE-en=Ukraine|SieheAuch=&lt;br /&gt;
* [[Vorlage:ukS-Latn]] – {{ukS-Latn}} (Romanisierung; nur lateinische Darstellung)&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:UkS&amp;diff=358</id>
		<title>Vorlage:UkS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:UkS&amp;diff=358"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#WEITERLEITUNG [[Vorlage:ukS-Cyrl]]&lt;br /&gt;
&lt;br /&gt;
Die ukrainische Sprache wird in kyrillischer Schrift geschrieben und so auch in der deutschsprachigen Wikipedia dargestellt.&lt;br /&gt;
&lt;br /&gt;
Romanisierung, also lateinische Umschrift, kommt nur sehr selten vor, insbesondere kaum im Zusammenhang mit der Nutzung dieser Vorlage.&lt;br /&gt;
&lt;br /&gt;
In den Artikeln soll deshalb die Form &amp;lt;code&amp;gt;{&amp;amp;#123;ukS}}&amp;lt;/code&amp;gt; für kyrillische Schrift benutzt werden und die Weiterleitung nicht aufgelöst werden.&lt;br /&gt;
&lt;br /&gt;
'''Diese Weiterleitung ist grundsätzlich kein Gegenstand von SLA.'''&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TrS&amp;diff=356</id>
		<title>Vorlage:TrS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TrS&amp;diff=356"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=tr|SCRIPTING=Latn|SERVICE=[[Türkische Sprache|türkisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=tr|SPRACHE=türkischer Sprache|TAUSEND=1|EXAMPLE=Türkiye Büyük Millet Meclisi|EXAMPLE-de=Große Nationalversammlung der Türkei|SieheAuch=* [[Vorlage:otaS]], [[Vorlage:ota]] – für Texte in osmanischer Sprache und arabischer Schrift vor der Sprachreform 1928}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ThS&amp;diff=354</id>
		<title>Vorlage:ThS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:ThS&amp;diff=354"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full |CODE=th |SCRIPTING=Thai |SERVICE=[[Thailändische Sprache|thailändisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Zyyy/Doku |SCRIPTING=Thai |CODE=th |SPRACHE=Thai-Sprache |SCHRIFT=Thai-Schrift |RTGS=1 |EXAMPLE=ภาษาไทย |EXAMPLE-Latn=paasaa tai |EXAMPLE-RTGS=Phasa Thai |EXAMPLE-Audio=th-phaasaathai.ogg |EXAMPLE-IPA=pʰaːsǎː tʰaj |EXAMPLE-de=Thailändisch |EXAMPLE-en=Thai language}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Werte&amp;diff=352</id>
		<title>Vorlage:TemplateData/Werte</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Werte&amp;diff=352"/>
		<updated>2022-02-23T14:42:23Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:JSONutil|encodeArray|type=object|error=1}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Parameter&amp;diff=350</id>
		<title>Vorlage:TemplateData/Parameter</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Parameter&amp;diff=350"/>
		<updated>2022-02-23T14:42:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#if: {{{1|}}}&lt;br /&gt;
| &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
    {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
      |sign={{{1}}}&lt;br /&gt;
      |type=object&lt;br /&gt;
      |value=&lt;br /&gt;
  {{#if: {{{label|{{{Kurz|{{{Label|}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=label|type=I18N&lt;br /&gt;
        |value={{{label|{{{Kurz|{{{Label}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{description|{{{Beschreibung|}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=description|type=I18N&lt;br /&gt;
        |value={{{description|{{{Beschreibung}}}}}}&lt;br /&gt;
        |error=1}}&lt;br /&gt;
}}{{#if: {{{type|{{{Typ|}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=type|type=string&lt;br /&gt;
        |value={{#ifeq: {{{type|{{{Typ}}}}}} | I18N | string | {{{type|{{{Typ}}}}}} }}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{required|{{{Pflicht|}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=required|type=boolean&lt;br /&gt;
        |value={{#if: {{#invoke:TemplUtl|faculty|&lt;br /&gt;
                 {{{required|{{{Pflicht}}}}}} }}&lt;br /&gt;
                 | 1 }}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{suggested|{{{Empfohlen|{{{Empfehlung|{{{Vorschlag|}}}}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=suggested|type=boolean&lt;br /&gt;
        |value={{#if: {{#invoke:TemplUtl|faculty|&lt;br /&gt;
                 {{{suggested|{{{Empfohlen|{{{Empfehlung|{{{Vorschlag}}}}}}}}}}}} }}&lt;br /&gt;
                 | 1 }}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{Werte|{{{suggestedvalues|}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=suggestedvalues|type=Array&lt;br /&gt;
        |value={{{Werte|{{{suggestedvalues}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{default|{{{Vorgabe|{{{Standard|{{{Default|}}}}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=default|type=I18N&lt;br /&gt;
        |value={{{default|{{{Vorgabe|{{{Standard|{{{Default|}}}}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{example|{{{Beispiel|}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=example|type=I18N&lt;br /&gt;
        |value={{{example|{{{Beispiel|}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{autovalue|{{{AutoWert|{{{Autowert|}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=autovalue|type=I18N&lt;br /&gt;
        |value={{{autovalue|{{{AutoWert|{{{Autowert}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{deprecated|{{{Veraltet|{{{Obsolet|}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=deprecated|type=boolean I18N&lt;br /&gt;
        |value={{{deprecated|{{{Veraltet|{{{Obsolet}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{aliases|{{{Aliasse|{{{Alias|}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=aliases|type=Array&lt;br /&gt;
        |value={{{aliases|{{{Aliasse|{{{Alias}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{inherits|{{{Geerbt|{{{Erbt|}}}}}}}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=inherits|type=string&lt;br /&gt;
        |value={{{inherits|{{{Geerbt|{{{Erbt|}}}}}}}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}{{#if: {{{style|}}}&lt;br /&gt;
    | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
      {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
        |sign=style|type=string object&lt;br /&gt;
        |value={{{style}}}&lt;br /&gt;
        |indent=3|error=1}}&lt;br /&gt;
}}&lt;br /&gt;
    |indent=2}}&lt;br /&gt;
| {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
    |sign=FEHLER@JSON&lt;br /&gt;
    |type=string&lt;br /&gt;
    |value=&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;Name des Parameters fehlt!&amp;lt;/span&amp;gt;}}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/JSON/val:lang&amp;diff=348</id>
		<title>Vorlage:TemplateData/JSON/val:lang</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/JSON/val:lang&amp;diff=348"/>
		<updated>2022-02-23T14:42:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:JSONutil|encodeComponent&lt;br /&gt;
  |sign=code|type=string&lt;br /&gt;
  |value={{{1}}}{{#if: {{{2|}}} | -{{{2}}}}}&lt;br /&gt;
  |indent=2&lt;br /&gt;
}}{{#invoke:JSONutil|encodeComponent&lt;br /&gt;
  |sign=label|type=string&lt;br /&gt;
  |value={{{{{1}}}S{{#if: {{{2|}}} | -{{{2}}}}}}}&lt;br /&gt;
  |indent=2}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/JSON&amp;diff=346</id>
		<title>Vorlage:TemplateData/JSON</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/JSON&amp;diff=346"/>
		<updated>2022-02-23T14:42:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:JSONutil|encodeObject&lt;br /&gt;
| {{#if: {{{description|{{{Beschreibung|}}}}}} | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
 {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
   |sign=description|type=I18N&lt;br /&gt;
   |value={{{description|{{{Beschreibung}}}}}}&lt;br /&gt;
   |indent=0&lt;br /&gt;
   |error=1}}&lt;br /&gt;
}}{{#if: {{{params|{{{Parameterliste|{{{Parameter|}}}}}}}}} | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
 {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
   |sign=params|type=object&lt;br /&gt;
   |value={{{params|{{{Parameterliste|{{{Parameter|}}}}}}}}}&lt;br /&gt;
   |indent=0&lt;br /&gt;
   |error=1}}&lt;br /&gt;
}}{{#if: {{{format|{{{Format|}}}}}} | &amp;lt;nowiki /&amp;gt;&lt;br /&gt;
 {{#invoke:JSONutil|encodeComponent&lt;br /&gt;
   |sign=format|type=string&lt;br /&gt;
   |value={{{format|{{{Format|}}}}}}}}&lt;br /&gt;
}}&lt;br /&gt;
|indent=0}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Aliasse&amp;diff=344</id>
		<title>Vorlage:TemplateData/Aliasse</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:TemplateData/Aliasse&amp;diff=344"/>
		<updated>2022-02-23T14:42:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:JSONutil|encodeArray|type=string|error=1}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SvS&amp;diff=342</id>
		<title>Vorlage:SvS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SvS&amp;diff=342"/>
		<updated>2022-02-23T14:42:22Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=sv|SCRIPTING=Latn|SERVICE=[[Schwedische Sprache|schwedisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=sv|SPRACHE=schwedischer Sprache|EXAMPLE=Köpenhamn|EXAMPLE-Audio=Sv-Köpenhamn.ogg|EXAMPLE-de=Kopenhagen|EXAMPLE-en=Copenhagen}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Str_replace&amp;diff=340</id>
		<title>Vorlage:Str replace</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:Str_replace&amp;diff=340"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{#invoke:Str|replace|{{{1|}}}|{{{2|}}}|{{{3|}}}|{{{4|}}}|{{{5|}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{Dokumentation}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:StS&amp;diff=338</id>
		<title>Vorlage:StS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:StS&amp;diff=338"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=st|SCRIPTING=Latn|SERVICE=[[Sesotho]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=st|SPRACHE=sesotho|EXAMPLE=bo-ntate ba ja nama|EXAMPLE-de=die Väter essen Fleisch|EXAMPLE-en=the fathers eat meat}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SrS&amp;diff=336</id>
		<title>Vorlage:SrS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SrS&amp;diff=336"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full |CODE=sr |SCRIPTING=Cyrl |SERVICE=[[Serbische Sprache|serbisch]]{{#if:{{{1|}}}|{{#if:{{{2|}}}||-[[Kyrillisches Alphabet#Serbisch, Serbokroatisch und Montenegrinisch|kyrillisch]]}}}}}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Zyyy/Doku |CODE=sr |SCRIPTING=Cyrl |SPRACHE=serbischer Sprache |SCHRIFT=kyrillischer Schrift |CYRL=1 |EXAMPLE=министарство |EXAMPLE-Latn=Ministarstvo |NKsub=Kyrillisch |SieheAuch=&lt;br /&gt;
* [[Vorlage:srS-Latn]] – in lateinischer Schrift &lt;br /&gt;
* [[Vorlage:bsS]] – {{bsS}}&lt;br /&gt;
* [[Vorlage:cnrS-Cyrl]] – {{cnrS-Cyrl}}&lt;br /&gt;
* [[Vorlage:hbsS]] – {{hbsS}}&lt;br /&gt;
* [[Vorlage:hrS]] – {{hrS}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SqS&amp;diff=334</id>
		<title>Vorlage:SqS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SqS&amp;diff=334"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;[[Albanische Sprache|albanisch]]{{#if:{{{2|}}}|&amp;amp;nbsp;auch}}{{#if:{{{1|}}}|&amp;amp;nbsp;&amp;lt;span style=&amp;quot;font-style:italic&amp;quot;&amp;gt;{{lang|sq|{{{1}}}}}&amp;lt;/span&amp;gt;|}}&amp;lt;!-- {{#if:{{{2|}}}|[[Kategorie:Wikipedia:Vorlagenfehler/Fremdsprachenunterstützung]]}} --&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
{{lang/Doku-S|Sprache=albanisch|ParamTyp1=Çiftelia|Param2=x|Anmerkung1=Mit dem zusätzlichen zweiten Parameter &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; (auch &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; oder ein anderer Wert möglich) wird das Wort „auch“ eingeblendet.}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Vorlage:Fremdsprachenunterstützung|SqS]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SmiS&amp;diff=332</id>
		<title>Vorlage:SmiS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SmiS&amp;diff=332"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=fi|SCRIPTING=Latn|SERVICE=[[Samische Sprachen|samisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=fi|SPRACHE=sonstiger samischer Sprache|SieheAuch=&lt;br /&gt;
* [[Vorlage:seS]] – {{seS}}&lt;br /&gt;
* [[Vorlage:fiS]] – {{fiS}}}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SkS&amp;diff=330</id>
		<title>Vorlage:SkS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SkS&amp;diff=330"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=sk|SCRIPTING=Latn|SERVICE=[[Slowakische Sprache|slowakisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=sk|SPRACHE=slowakischer Sprache|EXAMPLE=Lečo}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SaS&amp;diff=328</id>
		<title>Vorlage:SaS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:SaS&amp;diff=328"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=sa |SCRIPTING=Deva |SERVICE=[[Sanskrit]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Zyyy/Doku |CODE=sa |SCRIPTING=Deva |SPRACHE=Sanskrit |SCHRIFT=Devanagari-Schrift |EXAMPLE= |EXAMPLE-Latn= |EXAMPLE-IAST= |EXAMPLE-IPA= |EXAMPLE-de= |EXAMPLE-en=}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RuS&amp;diff=326</id>
		<title>Vorlage:RuS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RuS&amp;diff=326"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=ru|SCRIPTING=Cyrl|SERVICE=[[Russische Sprache|russisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Cyrl-nachgestellt/Doku|CODE=ru|SPRACHE=russischer Sprache|EXAMPLE-Cyrl=Москва́ |EXAMPLE-Latn=moskwa|EXAMPLE-Audio=ru-Moskva.ogg|EXAMPLE-IPA=mʌs'kva|EXAMPLE-de=Moskau|EXAMPLE-en=Moscow}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RoS&amp;diff=324</id>
		<title>Vorlage:RoS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RoS&amp;diff=324"/>
		<updated>2022-02-23T14:42:21Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=ro|SCRIPTING=Latn|SERVICE=[[Rumänische Sprache|rumänisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=ro|SPRACHE=rumänischer Sprache|EXAMPLE=gospodar}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RmS&amp;diff=322</id>
		<title>Vorlage:RmS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:RmS&amp;diff=322"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=rm|SCRIPTING=Latn|SERVICE=[[Bündnerromanisch|rätoromanisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=rm|SPRACHE=rätoromanisch|EXAMPLE=Rumantsch Grischun}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:PtS&amp;diff=320</id>
		<title>Vorlage:PtS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:PtS&amp;diff=320"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=pt|SCRIPTING=Latn|SERVICE=[[Portugiesische Sprache|portugiesisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=pt|SPRACHE=portugiesischer Sprache|EXAMPLE=Brasil |SieheAuch=* [[Vorlage:mwlS]] – {{mwlS}}}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:PlS&amp;diff=318</id>
		<title>Vorlage:PlS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:PlS&amp;diff=318"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=pl|SCRIPTING=Latn|SERVICE=[[Polnische Sprache|polnisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=pl|SPRACHE=polnischer Sprache|EXAMPLE=Noteć |SieheAuch=* [[Vorlage:szlS]] – {{szlS}}}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NoS&amp;diff=316</id>
		<title>Vorlage:NoS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NoS&amp;diff=316"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=no|SCRIPTING=Latn|SERVICE=[[Norwegische Sprache|norwegisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=no|SPRACHE=norwegische Sprache|EXAMPLE=banan|EXAMPLE-IPA=|EXAMPLE-Audio=|EXAMPLE-de=Banane|EXAMPLE-en=banana|SieheAuch=&lt;br /&gt;
* [[Vorlage:nbS]] – {{nbS}}&lt;br /&gt;
* [[Vorlage:nnS]] – {{nnS}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NnS&amp;diff=314</id>
		<title>Vorlage:NnS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NnS&amp;diff=314"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=nn|SCRIPTING=Latn|SERVICE=[[Nynorsk]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=nn|SPRACHE=Nynorsk|TAUSEND=|EXAMPLE=ein rev|EXAMPLE-IPA=|EXAMPLE-Audio=|EXAMPLE-de=ein Fuchs|EXAMPLE-en=a fox|SieheAuch=&lt;br /&gt;
* [[Vorlage:nbS]] – {{nbS}}&lt;br /&gt;
* [[Vorlage:noS]] – sonstige norwegische Sprache&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NlS&amp;diff=312</id>
		<title>Vorlage:NlS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NlS&amp;diff=312"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=nl|SCRIPTING=Latn|SERVICE=[[Niederländische Sprache|niederländisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=nl|SPRACHE=niederländischer Sprache|EXAMPLE=groen|EXAMPLE-Audio=nl-Groen.ogg|EXAMPLE-IPA=ɣrun|EXAMPLE-de=grün|EXAMPLE-en=green|SieheAuch=&lt;br /&gt;
* [[Vorlage:liS]] – {{liS}}&lt;br /&gt;
* [[Vorlage:fyS]] – {{fyS}}&lt;br /&gt;
* [[Vorlage:ndsS]] – {{ndsS}}&lt;br /&gt;
* [[Vorlage:vlsS]] – {{vlsS}}&lt;br /&gt;
* [[Vorlage:zeaS]] – {{zeaS}}&lt;br /&gt;
* [[Vorlage:ndsS-NL]] – {{ndsS-NL}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NdsS&amp;diff=310</id>
		<title>Vorlage:NdsS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NdsS&amp;diff=310"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=nds|SCRIPTING=Latn|SERVICE=[[Niederdeutsche Sprache|niederdeutsch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=nds|SPRACHE=niederdeutscher Sprache|EXAMPLE=Sleswig-Holsteen|SieheAuch=&lt;br /&gt;
* [[Vorlage:ndsS-NL]] – {{ndsS-NL}}&lt;br /&gt;
* [[Vorlage:fyS]] – {{fyS}}&lt;br /&gt;
* [[Vorlage:frsS]] – {{frsS}}&lt;br /&gt;
* [[Vorlage:frrS]] – {{frrS}}&lt;br /&gt;
* [[Vorlage:stqS]] – {{stqS}}&lt;br /&gt;
* [[Vorlage:wepS]] – {{wepS}}&lt;br /&gt;
* [[Vorlage:deS]] – {{deS}}&lt;br /&gt;
* [[Vorlage:nlS]] – {{nlS}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NbS&amp;diff=308</id>
		<title>Vorlage:NbS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:NbS&amp;diff=308"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=nb|SCRIPTING=Latn|SERVICE=[[Bokmål]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=nb|SPRACHE=Bokmål|TAUSEND=|EXAMPLE=en rev|EXAMPLE-IPA=|EXAMPLE-Audio=|EXAMPLE-de=ein Fuchs|EXAMPLE-en=a fox|SieheAuch=&lt;br /&gt;
* [[Vorlage:nnS]] – {{nnS}}&lt;br /&gt;
* [[Vorlage:noS]] – sonstige norwegische Sprache&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:MtS&amp;diff=306</id>
		<title>Vorlage:MtS</title>
		<link rel="alternate" type="text/html" href="https://biblex.rechtzeitig-ev.de/index.php?title=Vorlage:MtS&amp;diff=306"/>
		<updated>2022-02-23T14:42:20Z</updated>

		<summary type="html">&lt;p&gt;Admin: 1 Version importiert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#invoke:Vorlage:lang|full|CODE=mt|SCRIPTING=Latn|SERVICE=[[Maltesische Sprache|maltesisch]]}}&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{lang/Latn/Doku|CODE=mt|SPRACHE=maltesischer Sprache|EXAMPLE=Ta’ Marija Bambina|SieheAuch=&lt;br /&gt;
* [[Vorlage:enS]] – {{enS}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>