Jump to content
Toggle menu
  • 8 articles
  • 75 files
  • 7 users
  • 37.8K edits
Neodyland Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:TemplateBox: Difference between revisions

From Neodyland Wiki
m Exposing warning
m fixIt
Line 24: Line 24:
}
}
local paraminfoTLParams = {
local paraminfoTLParams = {
label = {
    label = {
required = false,
        required = false,
default = '',
        default = '',
t = 'InterfaceText'
        t = 'InterfaceText'
},
    },
required = {
    required = {
required = true,
        required = true,
default = false,
        default = false,
extract = function(pargs, number, paramVal)
        extract = function(pargs, number, paramVal)
local req = (pargs[number .. 'stat'] == 'required')
            local req = (pargs[number .. 'stat'] == 'required')
return tobool( paramVal or req )
            return tobool( paramVal or req )
end
        end
},
    },
description = {
    description = {
required = false,
        required = false,
default = '',
        default = '',
t = 'InterfaceText',
        t = 'InterfaceText',
alias = 'd'
        alias = 'd'
},
    },
deprecated = {
    deprecated = {
required = true,
        required = true,
default = false,
        default = false,
extract = function(pargs, number, paramVal)
        extract = function(pargs, number, paramVal)
local depr = (pargs[number .. 'stat'] == 'deprecated')
            local depr = (pargs[number .. 'stat'] == 'deprecated')
return tobool( paramVal or depr )
            return tobool( paramVal or depr )
end
        end
},
    },
aliases = {
    aliases = {
required = false,
        required = false,
default = '',
        default = '',
extract = function(pargs, number, paramVal)
        extract = function(pargs, number, paramVal)
local key = number .. 'aliases'
            local key = number .. 'aliases'
local tdkey = key .. '-td'
            local tdkey = key .. '-td'
local aliases = pargs[tdkey] or pargs[key]
            local aliases = pargs[tdkey] or pargs[key]
if aliases then
            if aliases then
aliases = mw.text.split( aliases, '/', true )
                aliases = mw.text.split( aliases, '/', true )
end
            end
return aliases
            return aliases
end
        end
},
    },
default = {
    default = {
required = false,
        required = false,
default = '',
        default = '',
t = 'InterfaceText',
        t = 'InterfaceText',
alias = 'def'
        alias = 'def'
},
    },
type = {
    type = {
required = false,
        required = false,
default = 'unknown',
        default = 'unknown',
t = 'selection',
        t = 'selection',
selection = 'unknown|number|string|string/wiki-user-name|string/wiki-page-name'
        selection = 'unknown|number|string|string/wiki-user-name|string/wiki-page-name'
},
    },
inherits = {
    inherits = {
required = false,
        required = false,
default = nil,
        default = nil,
t = 'string'
        t = 'string'
}
    }
-- sets will be treated differently because we can only have a plain structure in wikitext
    -- sets will be treated differently because we can only have a plain structure in wikitext
}
}


-- Initialize param info
-- Initialize param info
function init()
function init()
for a, v in pairs( paraminfoTLParams ) do
    for a, v in pairs( paraminfoTLParams ) do
if v.t ~= nil then
        if v.t ~= nil then
v.t = type( v.default )
            v.t = type( v.default )
end
        end
if v.selection then
        if v.selection then
v.selection = '|' .. v.selection .. '|'
            v.selection = '|' .. v.selection .. '|'
end
        end
end
    end
end
end
init()
init()
Line 99: Line 99:
function p.templatedata(frame)
function p.templatedata(frame)
     -- A real parser would look differently but it would likely be much more complex
     -- A real parser would look differently but it would likely be much more complex
local JSON = require('Module:JSON')
    local JSON = require('Module:JSON')
     local pargs = mw.clone( ( frame:getParent() or {} ).args or {} )
     local pargs = mw.clone( ( frame:getParent() or {} ).args or {} )
     local templateArgs = {}
     local templateArgs = {}
local i18nTemplateArgs = {}
    local i18nTemplateArgs = {}
     local tdata = {
     local tdata = {
         description = '',
         description = '',
Line 111: Line 111:
     }
     }
     local extractData = function( pi, number )
     local extractData = function( pi, number )
local prefix = number or ''
        local prefix = number or ''
local key, key2, tdkey, tdkey2, paramVal
        local key, key2, tdkey, tdkey2, paramVal
        local paramKey, paramTable
        if number then
            paramKey = pargs[number]
            tdata.params[paramKey] = {}
            paramTable = tdata.params[paramKey]
        end
         for p, info in pairs( pi ) do
         for p, info in pairs( pi ) do
key = prefix .. (info.alias or p)
            key = prefix .. (info.alias or p)
key2 = prefix .. p
            key2 = prefix .. p
tdkey = key .. '-td'
            tdkey = key .. '-td'
tdkey2 = key2 .. '-td'
            tdkey2 = key2 .. '-td'
             paramVal = pargs[tdkey] or pargs[tdkey2] or pargs[key] or pargs[key2] or info.default
             paramVal = pargs[tdkey] or pargs[tdkey2] or pargs[key] or pargs[key2] or info.default
-- Do we have a multilingual item?
            -- Do we have a multilingual item?
if i18nTemplateArgs[tdkey2] then
            if i18nTemplateArgs[tdkey2] then
paramVal = i18nTemplateArgs[tdkey2]
                paramVal = i18nTemplateArgs[tdkey2]
end
            end
if i18nTemplateArgs[tdkey] then
            if i18nTemplateArgs[tdkey] then
paramVal = i18nTemplateArgs[tdkey]
                paramVal = i18nTemplateArgs[tdkey]
end
            end
if 'function' == type( info.extract ) then
            if 'function' == type( info.extract ) then
paramVal = info.extract( pargs, number, paramVal )
                paramVal = info.extract( pargs, number, paramVal )
end
            end
           
local insertValue = function()
            local insertValue = function()
if number then
                if number then
tdata.params[p] = paramVal
                    paramTable[p] = paramVal
else
                else
tdata[p] = paramVal
                    tdata[p] = paramVal
end
                end
end
            end
           
if info.selection then
            if info.selection then
if info.selection:find( paramVal, 1, true ) then
                if info.selection:find( paramVal, 1, true ) then
insertValue()
                    insertValue()
end
                end
elseif 'InterfaceText' == info.t then
            elseif 'InterfaceText' == info.t then
if ({ table= 1, string=1 })[type( paramVal )] then
                if ({ table= 1, string=1 })[type( paramVal )] then
insertValue()
                    insertValue()
end
                end
elseif type( paramVal ) == info.t then
            elseif type( paramVal ) == info.t then
insertValue()
                insertValue()
end
            end
         end
         end
-- Now, treat sets
        -- Now, treat sets
key = prefix .. 'set'
        key = prefix .. 'set'
tdkey = prefix .. 'set-td'
        tdkey = prefix .. 'set-td'
paramVal = pargs[tdkey] or pargs[key]
        paramVal = pargs[tdkey] or pargs[key]
if paramVal then
        if paramVal then
local found = false
            local found = false
for i, s in ipairs( tdata.sets ) do
            for i, s in ipairs( tdata.sets ) do
if s.label == paramVal then
                if s.label == paramVal then
table.insert( s.params, p )
                    table.insert( s.params, p )
found = true
                    found = true
end
                end
end
            end
if not found then
            if not found then
table.insert( tdata.sets, {
                table.insert( tdata.sets, {
label = paramVal,  
                    label = paramVal,  
params = { p }
                    params = { p }
} )
                } )
end
            end
end
        end
    end
   
    if not pargs.templatedata then
        local warning = "Warning: Module:TemplateBox - templatedata invoked but not requested by user."
        mw.log(warning)
        tdata.description = warning
        return JSON:encode(tdata);
     end
     end
   
if not pargs.templatedata then
local warning = "Warning: Module:TemplateBox - templatedata invoked but not requested by user."
mw.log(warning)
tdata.description = warning
return JSON:encode(tdata);
end
     -- First, analyse the structure of the provided arguments
     -- First, analyse the structure of the provided arguments
     for a, v in pairs( pargs ) do
     for a, v in pairs( pargs ) do
         if type( a ) == 'number' then
         if type( a ) == 'number' then
             v = mw.text.trim( v )
             table.insert( templateArgs, a )
             if v ~= '' then
        else
                 table.insert( templateArgs, a )
            local argSplit = mw.text.split( a, '-', true )
             local argUnitl = {}
            local argAfter = {}
            local isTDArg = false
            for i, part in ipairs( argSplit ) do
                if isTDArg then
                    -- This is likely a language version
                    table.insert( argAfter, part )
                 else
                    table.insert( argUnitl, part )
                end
                if part == 'td' then
                    isTDArg = true
                end
             end
             end
else
            argUnitl = table.concat( argUnitl, '-' )
local argSplit = mw.text.split( a, '-', true )
            argAfter = table.concat( argAfter, '-' )
local argUnitl = {}
            i18nTemplateArgs[argUnitl] = i18nTemplateArgs[argUnitl] or {}
local argAfter = {}
            i18nTemplateArgs[argUnitl][argAfter] = v
local isTDArg = false
for i, part in ipairs( argSplit ) do
if isTDArg then
-- This is likely a language version
table.insert( argAfter, part )
else
table.insert( argUnitl, part )
end
if part == 'td' then
isTDArg = true
end
end
argUnitl = table.concat( argUnitl, '-' )
argAfter = table.concat( argAfter, '-' )
i18nTemplateArgs[argUnitl] = i18nTemplateArgs[argUnitl] or {}
i18nTemplateArgs[argUnitl][argAfter] = v
         end
         end
     end
     end
     -- Then, start building the actual template
     -- Then, start building the actual template
     extractData( paraminfoTemplate )
     extractData( paraminfoTemplate )
for i, number in pairs( templateArgs ) do
    for i, number in pairs( templateArgs ) do
extractData( paraminfoTLParams, number )
        extractData( paraminfoTLParams, number )
end
    end
   
-- And finally return the result
    -- And finally return the result
return JSON:encode( tdata );
    return JSON:encode( tdata );
end
end


return p
return p

Revision as of 18:16, 5 August 2013

Module documentation[ create · purge ]
This documentation is transcluded from Module:TemplateBox/doc.
local p = {}

-- =p.test({ args={a="b"} })
function p.test(frame)
    local args = frame.args
    local JSON = require('Module:JSON')
    
    return JSON:encode(args)
end

function tobool(st)
    return st == 'true'
end

-- InterfaceText:
-- A free-form string (no wikitext) in the content-language of the wiki, or, an object containing those strings keyed by language code.
local paraminfoTemplate = {
    description = {
        required = true,
        default = '',
        t = 'InterfaceText',
        alias = 'desc'
    }
}
local paraminfoTLParams = {
    label = {
        required = false,
        default = '',
        t = 'InterfaceText'
    },
    required = {
        required = true,
        default = false,
        extract = function(pargs, number, paramVal)
            local req = (pargs[number .. 'stat'] == 'required')
            return tobool( paramVal or req )
        end
    },
    description = {
        required = false,
        default = '',
        t = 'InterfaceText',
        alias = 'd'
    },
    deprecated = {
        required = true,
        default = false,
        extract = function(pargs, number, paramVal)
            local depr = (pargs[number .. 'stat'] == 'deprecated')
            return tobool( paramVal or depr )
        end
    },
    aliases = {
        required = false,
        default = '',
        extract = function(pargs, number, paramVal)
            local key = number .. 'aliases'
            local tdkey = key .. '-td'
            local aliases = pargs[tdkey] or pargs[key]
            if aliases then
                aliases = mw.text.split( aliases, '/', true )
            end
            return aliases
        end
    },
    default = {
        required = false,
        default = '',
        t = 'InterfaceText',
        alias = 'def'
    },
    type = {
        required = false,
        default = 'unknown',
        t = 'selection',
        selection = 'unknown|number|string|string/wiki-user-name|string/wiki-page-name'
    },
    inherits = {
        required = false,
        default = nil,
        t = 'string'
    }
    -- sets will be treated differently because we can only have a plain structure in wikitext
}

-- Initialize param info
function init()
    for a, v in pairs( paraminfoTLParams ) do
        if v.t ~= nil then
            v.t = type( v.default )
        end
        if v.selection then
            v.selection = '|' .. v.selection .. '|'
        end
    end
end
init()

function p.templatedata(frame)
    -- A real parser would look differently but it would likely be much more complex
    local JSON = require('Module:JSON')
    local pargs = mw.clone( ( frame:getParent() or {} ).args or {} )
    local templateArgs = {}
    local i18nTemplateArgs = {}
    local tdata = {
        description = '',
        params = {
        },
        sets = {
        }
    }
    local extractData = function( pi, number )
        local prefix = number or ''
        local key, key2, tdkey, tdkey2, paramVal
        local paramKey, paramTable
        if number then
            paramKey = pargs[number]
            tdata.params[paramKey] = {}
            paramTable = tdata.params[paramKey]
        end
        for p, info in pairs( pi ) do
            key = prefix .. (info.alias or p)
            key2 = prefix .. p
            tdkey = key .. '-td'
            tdkey2 = key2 .. '-td'
            paramVal = pargs[tdkey] or pargs[tdkey2] or pargs[key] or pargs[key2] or info.default
            -- Do we have a multilingual item?
            if i18nTemplateArgs[tdkey2] then
                paramVal = i18nTemplateArgs[tdkey2]
            end
            if i18nTemplateArgs[tdkey] then
                paramVal = i18nTemplateArgs[tdkey]
            end
            if 'function' == type( info.extract ) then
                paramVal = info.extract( pargs, number, paramVal )
            end
            
            local insertValue = function()
                if number then
                    paramTable[p] = paramVal
                else
                    tdata[p] = paramVal
                end
            end
            
            if info.selection then
                if info.selection:find( paramVal, 1, true ) then
                    insertValue()
                end
            elseif 'InterfaceText' == info.t then
                if ({ table= 1, string=1 })[type( paramVal )] then
                    insertValue()
                end
            elseif type( paramVal ) == info.t then
                insertValue()
            end
        end
        -- Now, treat sets
        key = prefix .. 'set'
        tdkey = prefix .. 'set-td'
        paramVal = pargs[tdkey] or pargs[key]
        if paramVal then
            local found = false
            for i, s in ipairs( tdata.sets ) do
                if s.label == paramVal then
                    table.insert( s.params, p )
                    found = true
                end
            end
            if not found then
                table.insert( tdata.sets, {
                    label = paramVal, 
                    params = { p }
                } )
            end
        end
    end
    
    if not pargs.templatedata then
        local warning = "Warning: Module:TemplateBox - templatedata invoked but not requested by user."
        mw.log(warning)
        tdata.description = warning
        return JSON:encode(tdata);
    end
    
    -- First, analyse the structure of the provided arguments
    for a, v in pairs( pargs ) do
        if type( a ) == 'number' then
            table.insert( templateArgs, a )
        else
            local argSplit = mw.text.split( a, '-', true )
            local argUnitl = {}
            local argAfter = {}
            local isTDArg = false
            for i, part in ipairs( argSplit ) do
                if isTDArg then
                    -- This is likely a language version
                    table.insert( argAfter, part )
                else
                    table.insert( argUnitl, part )
                end
                if part == 'td' then
                    isTDArg = true
                end
            end
            argUnitl = table.concat( argUnitl, '-' )
            argAfter = table.concat( argAfter, '-' )
            i18nTemplateArgs[argUnitl] = i18nTemplateArgs[argUnitl] or {}
            i18nTemplateArgs[argUnitl][argAfter] = v
        end
    end
    -- Then, start building the actual template
    extractData( paraminfoTemplate )
    for i, number in pairs( templateArgs ) do
        extractData( paraminfoTLParams, number )
    end
    
    -- And finally return the result
    return JSON:encode( tdata );
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.