Modul:TemplUtl/01

Vorlagenprogrammierung Diskussionen Lua Test Unterseiten
Modul Deutsch English

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


local TemplUtl = { suite   = "TemplUtl",
                   serial  = "2019-12-03",
                   sub     = "01",
                   commons = "i18n/01",
                   main    = 52364930 }
--[=[
Auxilary table generation,
showing strings for boolean values in all known languages.
]=]
local Failsafe = TemplUtl



local fetch = function ()
    -- Retrieve specifications from commons:Data:****.tab
    -- Postcondition:
    --     Returns
    --        1. table, sequence, with data
    --        2. table, with maximum colspan, as number
    local storage = string.format( "%s.tab", TemplUtl.commons )
    local lucky, data = pcall( mw.ext.data.get, storage, "_" )
    local r1 = { }
    local r2 = { [false] = 0,
                 [true]  = 0 }
    if type( data ) == "table"  and
       type( data.data ) == "table" then
        local o = { }
        local t = { }
        local e, l, s, w
        data = data.data
        for i = 1, #data do
            e = data[ i ]
            if type( e ) == "table"  and
               type( e[ 1 ] ) == "boolean"  and
               type( e[ 2 ] ) == "table" then
                l = e[ 1 ]
                e = e[ 2 ]
                for k, v in pairs( e ) do
                    if type( k ) == "string"  and
                       type( v ) == "string" then
                        w = mw.text.split( v, "|" )
                        if #w > r2[ l ] then
                            r2[ l ] = #w
                        end
                        table.insert( o, k )
                        if not t[ k ] then
                            t[ k ] = { }
                        end
                        t[ k ][ l ] = w
                    end
                end -- for k, v
            else
                break   -- for i
            end
        end   -- for i
        table.sort( o )
        for i = 1, #o do
            s = o[ i ]
            e = t[ s ]
            if e then
                w = { s = s }
                if type( e[ false ] ) == "table" then
                    w[ false ] = e[ false ]
                end
                if type( e[ true ] ) == "table" then
                    w[ true ] = e[ true ]
                end
                table.insert( r1, w )
                t[ s ] = false
            end
        end   -- for i
    end
    return r1, r2
end -- fetch()



local fiat = function ( apply, align, at, around )
    -- Create table row
    -- Precondition:
    --     apply   -- table, with data
    --     align   -- table, with maximum colspan
    --     at      -- string, with project language code
    --     around  -- string, with wrapping scripting direction
    -- Postcondition:
    --     Returns  mw.html.TR object
    local r = mw.html.create( "tr" )
    local e = mw.html.create( "code" )
                     :attr( "lang", "zxx" )
                     :wikitext( apply.s )
    local scripting
    local fk = function ( a, attr )
                   local td = mw.html.create( "td" )
                                     :attr( "lang", a )
                   if attr  and  attr ~= around then
                       td:attr( "dir", attr )
                   end
                   td:wikitext( mw.language.fetchLanguageName( apply.s,
                                                               a ) )
                   return td
               end -- fk()
    local fv = function ( a )
                   local v = apply[ a ]
                   r:newline()
                   if v then
                       local k = align[ a ] - #v
                       for i = 1, #v do
                           e = mw.html.create( "td" )
                                      :attr( "lang", apply.s )
                                      :wikitext( v[ i ] )
                           if scripting ~= around then
                               e:attr( "dir", scripting )
                           end
                           r:node( e )
                       end   -- for i
                       if k > 0 then
                           e = mw.html.create( "td" )
                           if k > 1 then
                               e:attr( "colspan",  tostring( k ) )
                           end
                           r:node( e )
                       end
                   else
                       r:node( mw.html.create( "td" )
                                      :attr( "colspan",
                                             tostring( align[ a ] ) ) )
                   end
               end -- fv()
    if mw.language.new( apply.s ):isRTL() then
        scripting = "rtl"
    else
        scripting = "ltr"
    end
    if around == "rtl" then
        e:attr( "dir", "ltr" )
    end
    r:newline()
     :node( mw.html.create( "td" )
                   :node( e ) )
     :newline()
     :node( fk( "en", "ltr" ) )
     :newline()
     :node( fk( apply.s, scripting ) )
    if at ~= "en" then
        r:newline()
         :node( fk( at ) )
    end
    fv( false )
    fv( true )
    return r
end -- fiat()



TemplUtl.f = function ( alien )
    -- Create table
    -- Precondition:
    --     alien  -- string, with language code, or not
    -- Postcondition:
    --     Returns  string with entire HTML table
    local tbl = mw.html.create( "table" )
                  :addClass( "wikitable sortable" )
                  :addClass( "TemplUtl-table-01" )
    local tr  = mw.html.create( "tr" )
    local rows, cols = fetch()
    local scripting, slang, speak
    if type( alien ) == "string"  and
       mw.language.isSupportedLanguage( alien ) then
        slang = mw.text.trim( alien )
    else
        local sub = mw.title.getCurrentTitle().subpageText
        if sub:find( "%l%l%l?%-?%a?%a?%a?%a?$" ) and
           mw.language.isSupportedLanguage( sub ) then
            slang = sub
        end
        if not slang then
            slang = mw.language.getContentLanguage():getCode()
        end
    end
    slang = slang:lower()
    speak = mw.language.fetchLanguageName( slang )
    tbl:attr( "lang", slang )
    if mw.language.new( slang ):isRTL() then
        scripting = "rtl"
    else
        scripting = "ltr"
    end
    tbl:attr( "dir", scripting )
    tr:newline()
      :node( mw.html.create( "th" )
                    :wikitext( "ISO 639 / BCP47" ) )
      :newline()
      :node( mw.html.create( "th" )
                    :wikitext( "English" ) )
      :newline()
      :node( mw.html.create( "th" )
                    :wikitext( "*" ) )
      :newline()
    if slang ~="en" then
        tr:node( mw.html.create( "th" )
                        :attr( "lang", slang )
                        :wikitext( speak ) )
          :newline()
    end
    tr:node( mw.html.create( "th" )
                    :attr( "colspan",  tostring( cols[ false ] ) )
                    :wikitext( "0" ) )
      :newline()
      :node( mw.html.create( "th" )
                    :attr( "colspan",  tostring( cols[ true ] ) )
                    :wikitext( "1" ) )
    tbl:newline()
--     :node( mw.html.create( "thead" )
                     :node( tr )
--          )
    for i = 1, #rows do
        tbl:newline()
           :node( fiat( rows[ i ], cols, slang, scripting ) )
    end -- for i
    return  tostring( tbl:newline() )
end -- TemplUtl.f()



-- Export
local p = { }

function p.f( frame )
    return TemplUtl.f( frame.args.lang )
end -- p.f

return p

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.