<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://agatadia.com/wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AText</id>
	<title>モジュール:Text - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://agatadia.com/wiki/index.php?action=history&amp;feed=atom&amp;title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%3AText"/>
	<link rel="alternate" type="text/html" href="https://agatadia.com/wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&amp;action=history"/>
	<updated>2026-04-11T21:26:37Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://agatadia.com/wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&amp;diff=1197&amp;oldid=prev</id>
		<title>Szkt: :wikipedia:ja:モジュール:Textからインポート済みの1版</title>
		<link rel="alternate" type="text/html" href="https://agatadia.com/wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&amp;diff=1197&amp;oldid=prev"/>
		<updated>2026-02-18T06:24:32Z</updated>

		<summary type="html">&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/ja:%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&quot; class=&quot;extiw&quot; title=&quot;wikipedia:ja:モジュール:Text&quot;&gt;wikipedia:ja:モジュール:Text&lt;/a&gt;からインポート済みの1版&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年2月18日 (水) 15:24時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key szkt_agatadia:diff:1.41:old-1196:rev-1197 --&gt;
&lt;/table&gt;</summary>
		<author><name>Szkt</name></author>
	</entry>
	<entry>
		<id>https://agatadia.com/wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&amp;diff=1196&amp;oldid=prev</id>
		<title>wikipedia:ja&gt;PerfektesChaos: 2024-06-05</title>
		<link rel="alternate" type="text/html" href="https://agatadia.com/wiki/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Text&amp;diff=1196&amp;oldid=prev"/>
		<updated>2024-07-29T17:05:35Z</updated>

		<summary type="html">&lt;p&gt;2024-06-05&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Text = { serial = &amp;quot;2024-06-05&amp;quot;,&lt;br /&gt;
               suite  = &amp;quot;Text&amp;quot;,&lt;br /&gt;
               item   = 29387871 }&lt;br /&gt;
--[=[&lt;br /&gt;
Text utilities&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe    = Text&lt;br /&gt;
local GlobalMod   = Text&lt;br /&gt;
local Patterns    = { }&lt;br /&gt;
local RangesLatin = false&lt;br /&gt;
local SeekQuote   = false&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 factoryQuote()&lt;br /&gt;
    -- Create quote definitions&lt;br /&gt;
    if not Text.quoteLang then&lt;br /&gt;
        local quoting = foreignModule( &amp;quot;Text&amp;quot;,&lt;br /&gt;
                                       false,&lt;br /&gt;
                                       &amp;quot;quoting&amp;quot;,&lt;br /&gt;
                                       Text.item )&lt;br /&gt;
        if type( quoting ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            Text.quoteLang = quoting.langs&lt;br /&gt;
            Text.quoteType = quoting.types&lt;br /&gt;
        end&lt;br /&gt;
        if type( Text.quoteLang ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            Text.quoteLang = { }&lt;br /&gt;
        end&lt;br /&gt;
        if type( Text.quoteType ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            Text.quoteType = { }&lt;br /&gt;
        end&lt;br /&gt;
        if type( Text.quoteLang.en ) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
            Text.quoteLang.en = &amp;quot;ld&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if type( Text.quoteType[ Text.quoteLang.en ] ) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
            Text.quoteType[ Text.quoteLang.en ] = { { 8220, 8221 },&lt;br /&gt;
                                                    { 8216, 8217 } }&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end -- factoryQuote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function fiatQuote( apply, alien, advance )&lt;br /&gt;
    -- Quote text&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code&lt;br /&gt;
    --     advance  -- number, with level 1 or 2&lt;br /&gt;
    local r = apply&lt;br /&gt;
    local quotes, suite&lt;br /&gt;
    factoryQuote()&lt;br /&gt;
    if alien then&lt;br /&gt;
        suite = mw.text.trim( alien )&lt;br /&gt;
        if suite == &amp;quot;&amp;quot; then&lt;br /&gt;
            suite = false&lt;br /&gt;
        else&lt;br /&gt;
            local s = Text.quoteLang[ suite ]&lt;br /&gt;
            if s then&lt;br /&gt;
                suite = s&lt;br /&gt;
            else&lt;br /&gt;
                local slang = suite:match( &amp;quot;^(%l+)-&amp;quot; )&lt;br /&gt;
                if slang then&lt;br /&gt;
                    suite = Text.quoteLang[ slang ]&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not suite then&lt;br /&gt;
        suite = Text.quoteLang.en&lt;br /&gt;
    end&lt;br /&gt;
    quotes = Text.quoteType[ suite ]&lt;br /&gt;
    if quotes then&lt;br /&gt;
        local space&lt;br /&gt;
        if quotes[ 3 ] then&lt;br /&gt;
            space = &amp;quot;&amp;amp;#160;&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            space = &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        quotes = quotes[ advance ]&lt;br /&gt;
        if quotes then&lt;br /&gt;
            r = mw.ustring.format( &amp;quot;%s%s%s%s%s&amp;quot;,&lt;br /&gt;
                                   mw.ustring.char( quotes[ 1 ] ),&lt;br /&gt;
                                   space,&lt;br /&gt;
                                   apply,&lt;br /&gt;
                                   space,&lt;br /&gt;
                                   mw.ustring.char( quotes[ 2 ] ) )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        mw.log( &amp;quot;fiatQuote() &amp;quot; .. suite )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fiatQuote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.char = function ( apply, again, accept )&lt;br /&gt;
    -- Create string from codepoints&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply   -- table (sequence) with numerical codepoints, or nil&lt;br /&gt;
    --     again   -- number of repetitions, or nil&lt;br /&gt;
    --     accept  -- true, if no error messages to be appended&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local r&lt;br /&gt;
    if type( apply ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local bad   = { }&lt;br /&gt;
        local codes = { }&lt;br /&gt;
        local s&lt;br /&gt;
        for k, v in pairs( apply ) do&lt;br /&gt;
            s = type( v )&lt;br /&gt;
            if s == &amp;quot;number&amp;quot; then&lt;br /&gt;
                if v &amp;lt; 32  and  v ~= 9  and  v ~= 10 then&lt;br /&gt;
                    v = tostring( v )&lt;br /&gt;
                else&lt;br /&gt;
                    v = math.floor( v )&lt;br /&gt;
                    s = false&lt;br /&gt;
                end&lt;br /&gt;
            elseif s ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
                v = tostring( v )&lt;br /&gt;
            end&lt;br /&gt;
            if s then&lt;br /&gt;
                table.insert( bad, v )&lt;br /&gt;
            else&lt;br /&gt;
                table.insert( codes, v )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        if #bad == 0 then&lt;br /&gt;
            if #codes &amp;gt; 0 then&lt;br /&gt;
                r = mw.ustring.char( unpack( codes ) )&lt;br /&gt;
                if again then&lt;br /&gt;
                    if type( again ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                        local n = math.floor( again )&lt;br /&gt;
                        if n &amp;gt; 1 then&lt;br /&gt;
                            r = r:rep( n )&lt;br /&gt;
                        elseif n &amp;lt; 1 then&lt;br /&gt;
                            r = &amp;quot;&amp;quot;&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        s = &amp;quot;bad repetitions: &amp;quot; .. tostring( again )&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            s = &amp;quot;bad codepoints: &amp;quot; .. table.concat( bad, &amp;quot; &amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
        if s  and  not accept then&lt;br /&gt;
            r = tostring(  mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                                  :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                                  :wikitext( s ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r or &amp;quot;&amp;quot;&lt;br /&gt;
end -- Text.char()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.concatParams = function ( args, apply, adapt )&lt;br /&gt;
    -- Concat list items into one string&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args   -- table (sequence) with numKey=string&lt;br /&gt;
    --     apply  -- string (optional); separator (default: &amp;quot;|&amp;quot;)&lt;br /&gt;
    --     adapt  -- string (optional); format including &amp;quot;%s&amp;quot;&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local collect = { }&lt;br /&gt;
    for k, v in pairs( args ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
            v = mw.text.trim( v )&lt;br /&gt;
            if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                if adapt then&lt;br /&gt;
                    v = mw.ustring.format( adapt, v )&lt;br /&gt;
                end&lt;br /&gt;
                table.insert( collect, v )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    return table.concat( collect,  apply or &amp;quot;|&amp;quot; )&lt;br /&gt;
end -- Text.concatParams()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.containsCJK = function ( analyse )&lt;br /&gt;
    -- Is any CJK code within?&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    -- Returns: true, if CJK detected&lt;br /&gt;
    local r&lt;br /&gt;
    if not Patterns.CJK then&lt;br /&gt;
        Patterns.CJK = mw.ustring.char( 91,&lt;br /&gt;
                                         0x3400, 45,  0x9FFF,&lt;br /&gt;
                                        0x20000, 45, 0x2B81F,&lt;br /&gt;
                                        93 )&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.find( analyse, Patterns.CJK ) then&lt;br /&gt;
        r = true&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.containsCJK()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.getPlain = function ( adjust )&lt;br /&gt;
    -- Remove wikisyntax from string, except templates&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local i = adjust:find( &amp;quot;&amp;lt;!--&amp;quot;, 1, true )&lt;br /&gt;
    local r = adjust&lt;br /&gt;
    local j&lt;br /&gt;
    while i do&lt;br /&gt;
        j = r:find( &amp;quot;--&amp;gt;&amp;quot;,  i + 3,  true )&lt;br /&gt;
        if j then&lt;br /&gt;
            r = r:sub( 1, i ) .. r:sub( j + 3 )&lt;br /&gt;
        else&lt;br /&gt;
            r = r:sub( 1, i )&lt;br /&gt;
        end&lt;br /&gt;
        i = r:find( &amp;quot;&amp;lt;!--&amp;quot;, i, true )&lt;br /&gt;
    end    -- &amp;quot;&amp;lt;!--&amp;quot;&lt;br /&gt;
    r = r:gsub( &amp;quot;(&amp;lt;/?%l[^&amp;gt;]*&amp;gt;)&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&amp;#039;&amp;#039;&amp;#039;(.+)&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;%1&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&amp;#039;&amp;#039;(.+)&amp;#039;&amp;#039;&amp;quot;, &amp;quot;%1&amp;quot; )&lt;br /&gt;
         :gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
    return mw.text.unstrip( r )&lt;br /&gt;
end -- Text.getPlain()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.isLatinRange = function ( adjust )&lt;br /&gt;
    -- Are characters expected to be latin or symbols within latin texts?&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string, or nil for initialization&lt;br /&gt;
    -- Returns: true, if valid for latin only&lt;br /&gt;
    local r&lt;br /&gt;
    if not RangesLatin then&lt;br /&gt;
        RangesLatin = { {   0x07, 0x02AF },&lt;br /&gt;
                        { 0x1D6B, 0x1D9A },&lt;br /&gt;
                        { 0x1E00, 0x1EFF },&lt;br /&gt;
                        { 0x2002, 0x203A },&lt;br /&gt;
                        { 0x2190, 0x23BD } }&lt;br /&gt;
    end&lt;br /&gt;
    if not Patterns.Latin then&lt;br /&gt;
        local range&lt;br /&gt;
        Patterns.Latin = &amp;quot;^[&amp;quot;&lt;br /&gt;
        for i = 1, #RangesLatin do&lt;br /&gt;
            range = RangesLatin[ i ]&lt;br /&gt;
            Patterns.Latin = Patterns.Latin ..&lt;br /&gt;
                           mw.ustring.char( range[ 1 ], 45, range[ 2 ] )&lt;br /&gt;
        end    -- for i&lt;br /&gt;
        Patterns.Latin = Patterns.Latin .. &amp;quot;]*$&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if adjust then&lt;br /&gt;
        if mw.ustring.match( adjust, Patterns.Latin ) then&lt;br /&gt;
            r = true&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 -- Text.isLatinRange()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.isQuote = function ( ask )&lt;br /&gt;
    -- Is this character any quotation mark?&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     ask  -- string, with single character&lt;br /&gt;
    -- Returns: true, if ask is quotation mark&lt;br /&gt;
    local r&lt;br /&gt;
    if not SeekQuote then&lt;br /&gt;
        SeekQuote = mw.ustring.char(   34,       -- &amp;quot;&lt;br /&gt;
                                       39,       -- &amp;#039;&lt;br /&gt;
                                      171,       -- laquo&lt;br /&gt;
                                      187,       -- raquo&lt;br /&gt;
                                     8216,       -- lsquo&lt;br /&gt;
                                     8217,       -- rsquo&lt;br /&gt;
                                     8218,       -- sbquo&lt;br /&gt;
                                     8220,       -- ldquo&lt;br /&gt;
                                     8221,       -- rdquo&lt;br /&gt;
                                     8222,       -- bdquo&lt;br /&gt;
                                     8249,       -- lsaquo&lt;br /&gt;
                                     8250,       -- rsaquo&lt;br /&gt;
                                     0x300C,     -- CJK&lt;br /&gt;
                                     0x300D,     -- CJK&lt;br /&gt;
                                     0x300E,     -- CJK&lt;br /&gt;
                                     0x300F )    -- CJK&lt;br /&gt;
    end&lt;br /&gt;
    if ask == &amp;quot;&amp;quot; then&lt;br /&gt;
        r = false&lt;br /&gt;
    elseif mw.ustring.find( SeekQuote, ask, 1, true ) then&lt;br /&gt;
        r = true&lt;br /&gt;
    else&lt;br /&gt;
        r = false&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.isQuote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.listToText = function ( args, adapt )&lt;br /&gt;
    -- Format list items similar to mw.text.listToText()&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args   -- table (sequence) with numKey=string&lt;br /&gt;
    --     adapt  -- string (optional); format including &amp;quot;%s&amp;quot;&lt;br /&gt;
    -- Returns: string&lt;br /&gt;
    local collect = { }&lt;br /&gt;
    for k, v in pairs( args ) do&lt;br /&gt;
        if type( k ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
            v = mw.text.trim( v )&lt;br /&gt;
            if v ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                if adapt then&lt;br /&gt;
                    v = mw.ustring.format( adapt, v )&lt;br /&gt;
                end&lt;br /&gt;
                table.insert( collect, v )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end -- for k, v&lt;br /&gt;
    return mw.text.listToText( collect )&lt;br /&gt;
end -- Text.listToText()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.quote = function ( apply, alien, advance )&lt;br /&gt;
    -- Quote text&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code, or nil&lt;br /&gt;
    --     advance  -- number, with level 1 or 2, or nil&lt;br /&gt;
    -- Returns: quoted string&lt;br /&gt;
    local mode, slang&lt;br /&gt;
    if type( alien ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        slang = mw.text.trim( alien ):lower()&lt;br /&gt;
    else&lt;br /&gt;
        local pageLang = mw.title.getCurrentTitle().pageLanguage&lt;br /&gt;
        if pageLang then&lt;br /&gt;
            slang = pageLang.code&lt;br /&gt;
        else&lt;br /&gt;
            slang = mw.language.getContentLanguage():getCode()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if advance == 2 then&lt;br /&gt;
        mode = 2&lt;br /&gt;
    else&lt;br /&gt;
        mode = 1&lt;br /&gt;
    end&lt;br /&gt;
    return fiatQuote( mw.text.trim( apply ), slang, mode )&lt;br /&gt;
end -- Text.quote()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.quoteUnquoted = function ( apply, alien, advance )&lt;br /&gt;
    -- Quote text, if not yet quoted and not empty&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     apply    -- string, with text&lt;br /&gt;
    --     alien    -- string, with language code, or nil&lt;br /&gt;
    --     advance  -- number, with level 1 or 2, or nil&lt;br /&gt;
    -- Returns: string; possibly quoted&lt;br /&gt;
    local r = mw.text.trim( apply )&lt;br /&gt;
    local s = mw.ustring.sub( r, 1, 1 )&lt;br /&gt;
    if s ~= &amp;quot;&amp;quot;  and  not Text.isQuote( s, advance ) then&lt;br /&gt;
        s = mw.ustring.sub( r, -1, 1 )&lt;br /&gt;
        if not Text.isQuote( s ) then&lt;br /&gt;
            r = Text.quote( r, alien, advance )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.quoteUnquoted()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.removeDiacritics = function ( adjust )&lt;br /&gt;
    -- Remove all diacritics&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string; all latin letters should be ASCII&lt;br /&gt;
    --                  or basic greek or cyrillic or symbols etc.&lt;br /&gt;
    local cleanup, decomposed&lt;br /&gt;
    if not Patterns.Combined then&lt;br /&gt;
        Patterns.Combined = mw.ustring.char( 91,&lt;br /&gt;
                                             0x0300, 45, 0x036F,&lt;br /&gt;
                                             0x1AB0, 45, 0x1AFF,&lt;br /&gt;
                                             0x1DC0, 45, 0x1DFF,&lt;br /&gt;
                                             0xFE20, 45, 0xFE2F,&lt;br /&gt;
                                             93 )&lt;br /&gt;
    end&lt;br /&gt;
    decomposed = mw.ustring.toNFD( adjust )&lt;br /&gt;
    cleanup    = mw.ustring.gsub( decomposed, Patterns.Combined, &amp;quot;&amp;quot; )&lt;br /&gt;
    return mw.ustring.toNFC( cleanup )&lt;br /&gt;
end -- Text.removeDiacritics()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.removeWhitespace = function ( adjust )&lt;br /&gt;
    -- Remove all whitespace, or replace with ASCII space&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string; modified&lt;br /&gt;
    local r = mw.text.decode( adjust )&lt;br /&gt;
    if r:find( &amp;quot;&amp;amp;&amp;quot;, 1, true ) then&lt;br /&gt;
        r = r: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( &amp;quot;&amp;amp;zwj;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;zwnj;&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;ensp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;emsp;&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if not Patterns.Whitespace then&lt;br /&gt;
       Patterns.Whitespace = mw.ustring.char( 0x00AD,&lt;br /&gt;
                                              91, 0x200C, 45, 0x200F, 93,&lt;br /&gt;
                                              91, 0x2028, 45, 0x202E, 93,&lt;br /&gt;
                                              0x205F,&lt;br /&gt;
                                              0x2060 )&lt;br /&gt;
       Patterns.Space      = mw.ustring.char( 0x00A0,&lt;br /&gt;
                                              0x1680,&lt;br /&gt;
                                              91, 0x2000, 45, 0x200A, 93,&lt;br /&gt;
                                              0x202F,&lt;br /&gt;
                                              0x205F,&lt;br /&gt;
                                              0x3000,&lt;br /&gt;
                                              0x303F )&lt;br /&gt;
    end&lt;br /&gt;
    r = mw.ustring.gsub( r, Patterns.Whitespace, &amp;quot;&amp;quot; )&lt;br /&gt;
    r = mw.ustring.gsub( r, Patterns.Space, &amp;quot; &amp;quot; )&lt;br /&gt;
    return mw.text.trim( r )&lt;br /&gt;
end -- Text.removeWhitespace()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.sentenceTerminated = function ( analyse )&lt;br /&gt;
    -- Is string terminated by dot, question or exclamation mark?&lt;br /&gt;
    --     Quotation, link termination and so on granted&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     analyse  -- string&lt;br /&gt;
    -- Returns: true, if sentence terminated&lt;br /&gt;
    local r  = mw.text.trim( analyse )&lt;br /&gt;
    local lt = r:find( &amp;quot;&amp;lt;&amp;quot;, 1, true )&lt;br /&gt;
    if not Patterns.Terminated then&lt;br /&gt;
        Patterns.Terminated = mw.ustring.char( 91,&lt;br /&gt;
                                               0x3002,&lt;br /&gt;
                                               0xFF01,&lt;br /&gt;
                                               0xFF0E,&lt;br /&gt;
                                               0xFF1F )&lt;br /&gt;
                                           .. &amp;quot;!%.%?…][\&amp;quot;&amp;#039;%]‹›«»‘’“”]*$&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    if lt then&lt;br /&gt;
        r = r:gsub( &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if mw.ustring.find( r, Patterns.Terminated ) then&lt;br /&gt;
        r = true&lt;br /&gt;
    elseif lt then&lt;br /&gt;
        local s = &amp;quot;&amp;lt;bdi[^&amp;gt;]* dir=\&amp;quot;([lr]t[rl])\&amp;quot;.+&amp;lt;/bdi&amp;gt;&amp;lt;/bdo&amp;gt;&amp;quot;&lt;br /&gt;
        s = r:match( s )&lt;br /&gt;
        if s then&lt;br /&gt;
            if mw.language.getContentLanguage():isRTL() then&lt;br /&gt;
                r = ( s == &amp;quot;ltr&amp;quot; )&lt;br /&gt;
            else&lt;br /&gt;
                r = ( s == &amp;quot;rtl&amp;quot; )&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 -- Text.sentenceTerminated()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.tokenWords = function ( adjust )&lt;br /&gt;
    -- Split text in words of digits or letters&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string with&lt;br /&gt;
    local r = mw.uri.decode( adjust, &amp;quot;WIKI&amp;quot; )&lt;br /&gt;
    if r:find( &amp;quot;&amp;amp;&amp;quot;, 1, true ) then&lt;br /&gt;
        r = mw.text.decode( r )&lt;br /&gt;
    end&lt;br /&gt;
    r = Text.removeWhitespace( r )&lt;br /&gt;
    r = mw.ustring.gsub( r, &amp;quot;[%p%s]+&amp;quot;, &amp;quot; &amp;quot; )&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.tokenWords()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.ucfirstAll = function ( adjust )&lt;br /&gt;
    -- Capitalize all words&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string with all first letters in upper case&lt;br /&gt;
    local r = &amp;quot; &amp;quot; .. adjust&lt;br /&gt;
    local i = 1&lt;br /&gt;
    local c, j, m&lt;br /&gt;
    if adjust:find( &amp;quot;&amp;amp;&amp;quot; ) then&lt;br /&gt;
        r = r:gsub( &amp;quot;&amp;amp;amp;&amp;quot;,      &amp;quot;&amp;amp;#38;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;lt;&amp;quot;,       &amp;quot;&amp;amp;#60;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;gt;&amp;quot;,       &amp;quot;&amp;amp;#62;&amp;quot; )&lt;br /&gt;
             :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;
        m = true&lt;br /&gt;
    end&lt;br /&gt;
    while i do&lt;br /&gt;
        i = mw.ustring.find( r, &amp;quot;%W%l&amp;quot;, i )&lt;br /&gt;
        if i then&lt;br /&gt;
            j = i + 1&lt;br /&gt;
            c = mw.ustring.upper( mw.ustring.sub( r, j, j ) )&lt;br /&gt;
            r = string.format( &amp;quot;%s%s%s&amp;quot;,&lt;br /&gt;
                               mw.ustring.sub( r, 1, i ),&lt;br /&gt;
                               c,&lt;br /&gt;
                               mw.ustring.sub( r, i + 2 ) )&lt;br /&gt;
            i = j&lt;br /&gt;
        end&lt;br /&gt;
    end -- while i&lt;br /&gt;
    r = r:sub( 2 )&lt;br /&gt;
    if m then&lt;br /&gt;
        r = r:gsub(     &amp;quot;&amp;amp;#38;&amp;quot;, &amp;quot;&amp;amp;amp;&amp;quot; )&lt;br /&gt;
             :gsub(     &amp;quot;&amp;amp;#60;&amp;quot;, &amp;quot;&amp;amp;lt;&amp;quot; )&lt;br /&gt;
             :gsub(     &amp;quot;&amp;amp;#62;&amp;quot;, &amp;quot;&amp;amp;gt;&amp;quot; )&lt;br /&gt;
             :gsub(    &amp;quot;&amp;amp;#160;&amp;quot;, &amp;quot;&amp;amp;nbsp;&amp;quot; )&lt;br /&gt;
             :gsub(   &amp;quot;&amp;amp;#8201;&amp;quot;, &amp;quot;&amp;amp;thinsp;&amp;quot; )&lt;br /&gt;
             :gsub(   &amp;quot;&amp;amp;#8204;&amp;quot;, &amp;quot;&amp;amp;zwnj;&amp;quot; )&lt;br /&gt;
             :gsub(   &amp;quot;&amp;amp;#8205;&amp;quot;, &amp;quot;&amp;amp;zwj;&amp;quot; )&lt;br /&gt;
             :gsub(   &amp;quot;&amp;amp;#8206;&amp;quot;, &amp;quot;&amp;amp;lrm;&amp;quot; )&lt;br /&gt;
             :gsub(   &amp;quot;&amp;amp;#8207;&amp;quot;, &amp;quot;&amp;amp;rlm;&amp;quot; )&lt;br /&gt;
             :gsub( &amp;quot;&amp;amp;#X(%x+);&amp;quot;, &amp;quot;&amp;amp;#x%1;&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.ucfirstAll()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Text.uprightNonlatin = function ( adjust )&lt;br /&gt;
    -- Ensure non-italics for non-latin text parts&lt;br /&gt;
    --     One single greek letter might be granted&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     adjust  -- string&lt;br /&gt;
    -- Returns: string with non-latin parts enclosed in &amp;lt;span&amp;gt;&lt;br /&gt;
    local r&lt;br /&gt;
    Text.isLatinRange()&lt;br /&gt;
    if mw.ustring.match( adjust, Patterns.Latin ) then&lt;br /&gt;
        -- latin only, horizontal dashes, quotes&lt;br /&gt;
        r = adjust&lt;br /&gt;
    else&lt;br /&gt;
        local c&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
        local j = false&lt;br /&gt;
        local k = 1&lt;br /&gt;
        local m = false&lt;br /&gt;
        local n = mw.ustring.len( adjust )&lt;br /&gt;
        local p&lt;br /&gt;
        local flat = function ( a )&lt;br /&gt;
                  -- isLatin&lt;br /&gt;
                  local range&lt;br /&gt;
                  for i = 1, #RangesLatin do&lt;br /&gt;
                      range = RangesLatin[ i ]&lt;br /&gt;
                      if a &amp;gt;= range[ 1 ]  and  a &amp;lt;= range[ 2 ] then&lt;br /&gt;
                          return true&lt;br /&gt;
                      end&lt;br /&gt;
                  end    -- for i&lt;br /&gt;
              end -- flat()&lt;br /&gt;
        local focus = function ( a )&lt;br /&gt;
                  -- char is not ambivalent&lt;br /&gt;
                  local r = ( a &amp;gt; 64 )&lt;br /&gt;
                  if r then&lt;br /&gt;
                      r = ( a &amp;lt; 8192  or  a &amp;gt; 8212 )&lt;br /&gt;
                  else&lt;br /&gt;
                      r = ( a == 38  or  a == 60 )    -- &amp;#039;&amp;amp;&amp;#039; &amp;#039;&amp;lt;&amp;#039;&lt;br /&gt;
                  end&lt;br /&gt;
                  return r&lt;br /&gt;
              end -- focus()&lt;br /&gt;
        local form = function ( a )&lt;br /&gt;
                return string.format( p,&lt;br /&gt;
                                      r,&lt;br /&gt;
                                      mw.ustring.sub( adjust, k, j - 1 ),&lt;br /&gt;
                                      mw.ustring.sub( adjust, j, a ) )&lt;br /&gt;
              end -- form()&lt;br /&gt;
        e:attr( &amp;quot;dir&amp;quot;, &amp;quot;auto&amp;quot; )&lt;br /&gt;
         :css( &amp;quot;font-style&amp;quot;, &amp;quot;normal&amp;quot; )&lt;br /&gt;
         :wikitext( &amp;quot;%s&amp;quot; )&lt;br /&gt;
        p = &amp;quot;%s%s&amp;quot; .. tostring( e )&lt;br /&gt;
        r = &amp;quot;&amp;quot;&lt;br /&gt;
        for i = 1, n do&lt;br /&gt;
            c = mw.ustring.codepoint( adjust, i, i )&lt;br /&gt;
            if focus( c ) then&lt;br /&gt;
                if flat( c ) then&lt;br /&gt;
                    if j then&lt;br /&gt;
                        if m then&lt;br /&gt;
                            if i == m then&lt;br /&gt;
                                -- single greek letter.&lt;br /&gt;
                                j = false&lt;br /&gt;
                            end&lt;br /&gt;
                            m = false&lt;br /&gt;
                        end&lt;br /&gt;
                        if j then&lt;br /&gt;
                            local nx = i - 1&lt;br /&gt;
                            local s  = &amp;quot;&amp;quot;&lt;br /&gt;
                            for ix = nx, 1, -1 do&lt;br /&gt;
                                c = mw.ustring.sub( adjust, ix, ix )&lt;br /&gt;
                                if c == &amp;quot; &amp;quot;  or  c == &amp;quot;(&amp;quot; then&lt;br /&gt;
                                    nx = nx - 1&lt;br /&gt;
                                    s  = c .. s&lt;br /&gt;
                                else&lt;br /&gt;
                                    break -- for ix&lt;br /&gt;
                                end&lt;br /&gt;
                            end -- for ix&lt;br /&gt;
                            r = form( nx ) .. s&lt;br /&gt;
                            j = false&lt;br /&gt;
                            k = i&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                elseif not j then&lt;br /&gt;
                    j = i&lt;br /&gt;
                    if c &amp;gt;= 880  and  c &amp;lt;= 1023 then&lt;br /&gt;
                        -- single greek letter?&lt;br /&gt;
                        m = i + 1&lt;br /&gt;
                    else&lt;br /&gt;
                        m = false&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            elseif m then&lt;br /&gt;
                m = m + 1&lt;br /&gt;
            end&lt;br /&gt;
        end    -- for i&lt;br /&gt;
        if j  and  ( not m  or  m &amp;lt; n ) then&lt;br /&gt;
            r = form( n )&lt;br /&gt;
        else&lt;br /&gt;
            r = r .. mw.ustring.sub( adjust, k )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.uprightNonlatin()&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;
    -- 2024-03-01&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;
        elseif link then&lt;br /&gt;
            r = false&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;
Text.test = function ( about )&lt;br /&gt;
    local r&lt;br /&gt;
    if about == &amp;quot;quote&amp;quot; then&lt;br /&gt;
        factoryQuote()&lt;br /&gt;
        r = { QuoteLang = Text.quoteLang,&lt;br /&gt;
              QuoteType = Text.quoteType }&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Text.test()&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.char( frame )&lt;br /&gt;
    local params = frame:getParent().args&lt;br /&gt;
    local story = params[ 1 ]&lt;br /&gt;
    local codes, lenient, multiple&lt;br /&gt;
    if not story then&lt;br /&gt;
        params = frame.args&lt;br /&gt;
        story  = params[ 1 ]&lt;br /&gt;
    end&lt;br /&gt;
    if story then&lt;br /&gt;
        local items = mw.text.split( story, &amp;quot;%s+&amp;quot; )&lt;br /&gt;
        if #items &amp;gt; 0 then&lt;br /&gt;
            local j&lt;br /&gt;
            lenient  = ( params.errors == &amp;quot;0&amp;quot; )&lt;br /&gt;
            codes    = { }&lt;br /&gt;
            multiple = tonumber( params[ &amp;quot;*&amp;quot; ] )&lt;br /&gt;
            for k, v in pairs( items ) do&lt;br /&gt;
                if v:sub( 1, 1 ) == &amp;quot;x&amp;quot; then&lt;br /&gt;
                    j = tonumber( &amp;quot;0&amp;quot; .. v )&lt;br /&gt;
                elseif v == &amp;quot;&amp;quot; then&lt;br /&gt;
                    v = false&lt;br /&gt;
                else&lt;br /&gt;
                    j = tonumber( v )&lt;br /&gt;
                end&lt;br /&gt;
                if v then&lt;br /&gt;
                    table.insert( codes,  j or v )&lt;br /&gt;
                end&lt;br /&gt;
            end -- for k, v&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Text.char( codes, multiple, lenient )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.concatParams( frame )&lt;br /&gt;
    local args&lt;br /&gt;
    local template = frame.args.template&lt;br /&gt;
    if type( template ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        template = mw.text.trim( template )&lt;br /&gt;
        template = ( template == &amp;quot;1&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if template then&lt;br /&gt;
        args = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        args = frame.args&lt;br /&gt;
    end&lt;br /&gt;
    return Text.concatParams( args,&lt;br /&gt;
                              frame.args.separator,&lt;br /&gt;
                              frame.args.format )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.containsCJK( frame )&lt;br /&gt;
    return Text.containsCJK( frame.args[ 1 ] or &amp;quot;&amp;quot; ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getPlain( frame )&lt;br /&gt;
    return Text.getPlain( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.isLatinRange( frame )&lt;br /&gt;
    return Text.isLatinRange( frame.args[ 1 ] or &amp;quot;&amp;quot; ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.isQuote( frame )&lt;br /&gt;
    return Text.isQuote( frame.args[ 1 ] or &amp;quot;&amp;quot; ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.listToFormat(frame)&lt;br /&gt;
    local lists = {}&lt;br /&gt;
    local pformat = frame.args[&amp;quot;format&amp;quot;]&lt;br /&gt;
    local sep = frame.args[&amp;quot;sep&amp;quot;] or &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Parameter parsen: Listen&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        local knum = tonumber(k)&lt;br /&gt;
        if knum then lists[knum] = v end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Listen splitten&lt;br /&gt;
    local maxListLen = 0&lt;br /&gt;
    for i = 1, #lists do&lt;br /&gt;
        lists[i] = mw.text.split(lists[i], sep)&lt;br /&gt;
        if #lists[i] &amp;gt; maxListLen then maxListLen = #lists[i] end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Ergebnisstring generieren&lt;br /&gt;
    local result = &amp;quot;&amp;quot;&lt;br /&gt;
    local result_line = &amp;quot;&amp;quot;&lt;br /&gt;
    for i = 1, maxListLen do&lt;br /&gt;
        result_line = pformat&lt;br /&gt;
        for j = 1, #lists do&lt;br /&gt;
            result_line = mw.ustring.gsub( result_line,&lt;br /&gt;
                                           &amp;quot;%%s&amp;quot;,&lt;br /&gt;
                                           lists[ j ][ i ],&lt;br /&gt;
                                           1 )&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. result_line&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.listToText( frame )&lt;br /&gt;
    local args&lt;br /&gt;
    local template = frame.args.template&lt;br /&gt;
    if type( template ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        template = mw.text.trim( template )&lt;br /&gt;
        template = ( template == &amp;quot;1&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    if template then&lt;br /&gt;
        args = frame:getParent().args&lt;br /&gt;
    else&lt;br /&gt;
        args = frame.args&lt;br /&gt;
    end&lt;br /&gt;
    return Text.listToText( args, frame.args.format )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.quote( frame )&lt;br /&gt;
    local slang = frame.args[2]&lt;br /&gt;
    if type( slang ) == &amp;quot;string&amp;quot; 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;
    return Text.quote( frame.args[ 1 ] or &amp;quot;&amp;quot;,&lt;br /&gt;
                       slang,&lt;br /&gt;
                       tonumber( frame.args[3] ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.quoteUnquoted( frame )&lt;br /&gt;
    local slang = frame.args[2]&lt;br /&gt;
    if type( slang ) == &amp;quot;string&amp;quot; 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;
    return Text.quoteUnquoted( frame.args[ 1 ] or &amp;quot;&amp;quot;,&lt;br /&gt;
                               slang,&lt;br /&gt;
                               tonumber( frame.args[3] ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.removeDiacritics( frame )&lt;br /&gt;
    return Text.removeDiacritics( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.sentenceTerminated( frame )&lt;br /&gt;
    return Text.sentenceTerminated( frame.args[ 1 ] or &amp;quot;&amp;quot; ) and &amp;quot;1&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tokenWords( frame )&lt;br /&gt;
    return Text.tokenWords( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ucfirstAll( frame )&lt;br /&gt;
    return Text.ucfirstAll( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unstrip( frame )&lt;br /&gt;
    return mw.text.trim( mw.text.unstrip( frame.args[ 1 ] or &amp;quot;&amp;quot; ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.uprightNonlatin( frame )&lt;br /&gt;
    return Text.uprightNonlatin( frame.args[ 1 ] or &amp;quot;&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.zip(frame)&lt;br /&gt;
    local lists = {}&lt;br /&gt;
    local seps = {}&lt;br /&gt;
    local defaultsep = frame.args[&amp;quot;sep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local innersep = frame.args[&amp;quot;isep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    local outersep = frame.args[&amp;quot;osep&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    -- Parameter parsen&lt;br /&gt;
    for k, v in pairs(frame.args) do&lt;br /&gt;
        local knum = tonumber(k)&lt;br /&gt;
        if knum then lists[knum] = v else&lt;br /&gt;
            if string.sub(k, 1, 3) == &amp;quot;sep&amp;quot; then&lt;br /&gt;
                local sepnum = tonumber(string.sub(k, 4))&lt;br /&gt;
                if sepnum then seps[sepnum] = v end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    -- sofern keine expliziten Separatoren angegeben sind, den Standardseparator verwenden&lt;br /&gt;
    for i = 1, math.max(#seps, #lists) do&lt;br /&gt;
        if not seps[i] then seps[i] = defaultsep end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Listen splitten&lt;br /&gt;
    local maxListLen = 0&lt;br /&gt;
    for i = 1, #lists do&lt;br /&gt;
        lists[i] = mw.text.split(lists[i], seps[i])&lt;br /&gt;
        if #lists[i] &amp;gt; maxListLen then maxListLen = #lists[i] end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;&amp;quot;&lt;br /&gt;
    for i = 1, maxListLen do&lt;br /&gt;
        if i ~= 1 then result = result .. outersep end&lt;br /&gt;
        for j = 1, #lists do&lt;br /&gt;
            if j ~= 1 then result = result .. innersep end&lt;br /&gt;
            result = result .. (lists[j][i] or &amp;quot;&amp;quot;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&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.Text = function ()&lt;br /&gt;
    return Text&lt;br /&gt;
end -- p.Text&lt;br /&gt;
&lt;br /&gt;
setmetatable( p,  { __call = function ( func, ... )&lt;br /&gt;
                                 setmetatable( p, nil )&lt;br /&gt;
                                 return Failsafe&lt;br /&gt;
                             end } )&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia:ja&gt;PerfektesChaos</name></author>
	</entry>
</feed>