Module:Information
From Neodyland Wiki
More actions
This documentation is transcluded from Module:Information/doc.
--[[
__ __ _ _ ___ __ _ _
| \/ | ___ __| |_ _| | ___ _|_ _|_ __ / _| ___ _ __ _ __ ___ __ _| |_(_) ___ _ __
| |\/| |/ _ \ / _` | | | | |/ _ (_)| || '_ \| |_ / _ \| '__| '_ ` _ \ / _` | __| |/ _ \| '_ \
| | | | (_) | (_| | |_| | | __/_ | || | | | _| (_) | | | | | | | | (_| | |_| | (_) | | | |
|_| |_|\___/ \__,_|\__,_|_|\___(_)___|_| |_|_| \___/|_| |_| |_| |_|\__,_|\__|_|\___/|_| |_|
This module is intended to be the engine behind "Template:Information".
Please do not modify this code without applying the changes first at
"Module:Information/sandbox" and testing at "Module:Information/testcases".
Authors and maintainers:
* User:Jarekt - original version
]]
local ISOdate = require('Module:ISOdate')
-- ====================================================================
-- This function is responsible for producing HTML of a single row of the template
-- At this stage all the fields are already filed. There is either one or two fields
-- INPUTS:
-- * param - structures containing fields:
-- - tag - I18n tag used for localization of the field name. Usually name of page in MediaWiki namespace which was imported from translatewiki.org.
-- Alternative is to pass already translated field name.
-- - field - field content
-- - id - ID tag added to HTML's <td> cell. if IDs of 2 fields ar the same than we ignore the second one
-- - wrapper - some fields need a <span class=...> wrapper around the field content
-- ====================================================================
local function Build_html_row(param, args)
local field = args[param.field]
if field=='' then field=nul; end
if not (field or args.demo) then
return nil
end
if not param.id then -- "other fields" parameter
return field
end
local tag = param.tag or 'bad'
tag = mw.message.new( tag ):inLanguage(args.lang):plain() -- label message in args.lang language
cell1 = string.format('<td id="%s" class="fileinfo-paramfield" lang="%s">%s</td>\n', param.id, args.lang, tag)
local cell2 = string.format('<td>\n'.. param.wrapper ..'</td>', field or '')
return string.format('<tr valign="top">\n%s%s\n</tr>\n\n', cell1, cell2)
end
-- ====================================================================
-- === This function is just responsible for producing HTML of the ===
-- === template. At this stage all the fields are already filed ===
-- ====================================================================
local function Build_html(args)
-- get text direction
local dir
if mw.language.new( args.lang ):isRTL() then
dir = 'rtl'
else
dir = 'ltr'
end
-- files with no source will be flagged
if (not args.source and not args.source_) and args.strict and (args.namespace==6) then
args.nosource = mw.getCurrentFrame():expandTemplate{ title = 'Source missing' }
end
-- Permissions tag
local tag1 = mw.message.new( "wm-license-information-permission" ):inLanguage(args.lang):plain()
local tag2 = mw.message.new( "wm-license-information-permission-reusing-link" ):inLanguage(args.lang):plain()
local tag3 = mw.message.new( "wm-license-information-permission-reusing-text" ):inLanguage(args.lang):plain()
local permission_tag = string.format("%s<br /><small>([[%s|%s]])</small>", tag1, tag2, tag3)
-- add other fields
local params = {
{field='author' , id='fileinfotpl_aut' , tag='wm-license-information-author', wrapper='<div class="fn value">\n%s</div>'},
{field='other_fields_1'},
{field='date' , id='fileinfotpl_date' , tag='wm-license-information-date', wrapper='%s'},
{field='source' , id='fileinfotpl_src' , tag='wm-license-information-source', wrapper='%s'}, -- source
{field='nosource' , id='fileinfotpl_nosrc' , tag='wm-license-information-source', wrapper='%s'},
{field='permission' , id='fileinfotpl_perm' , tag=permission_tag, wrapper='%s'},
{field='other_versions' , id='fileinfotpl_ver' , tag='wm-license-information-other-versions', wrapper='%s'},
{field='other_fields'}
}
local results = {}
for i=1,#params do
table.insert(results, Build_html_row(params[i], args))
end
-- add table and outer layers
local style = string.format('class="fileinfotpl-type-artwork toccolours vevent mw-content-%s" dir="%s" style="width: 100%%" cellpadding="4"', dir, dir)
results = string.format('<table %s>\n%s\n</table>\n', style, table.concat(results))
results = string.format('<div class="hproduct commons-file-information-table">\n%s\n</div>\n', results)
return results
end
-- ==================================================
-- === External functions ===========================
-- ==================================================
local p = {}
-- ===========================================================================
-- === Version of the function to be called from other LUA codes
-- ===========================================================================
function p._information(args)
-- ====================================================
-- === automatic tagging of pages in all namespaces ===
-- ====================================================
if args.date then
-- add an empty template which can be used as a tag in PetScan
local d = os.date('!*t') -- current date table
local current_year = tonumber(d.year) -- current year
local creation_year = tonumber(ISOdate._ISOyear(args.date))
if creation_year and current_year and (current_year-creation_year)>200 then
mw.getCurrentFrame():expandTemplate{ title ='Works created more than 200 years ago' }
end
end
mw.getCurrentFrame():expandTemplate{ title = 'Infobox template tag' } -- add the template tag
return Build_html(args)
end
-- ===========================================================================
-- === Version of the function to be called from template namespace
-- ===========================================================================
function p.information(frame)
-- switch to lowercase parameters to make them case independent
local args = {}
for name, value in pairs( frame:getParent().args ) do
if value ~= '' then -- nuke empty strings
local name1 = string.gsub( string.lower(name), ' ', '_')
args[name1] = value
end
end
for name, value in pairs( frame.args ) do
if value ~= '' then -- nuke empty strings
local name1 = string.gsub( string.lower(name), ' ', '_')
args[name1] = value
end
end
if not (args.lang and mw.language.isSupportedLanguage(args.lang)) then
args.lang = frame:callParserFunction( "int", "lang" ) -- get user's chosen language
end
-- call the inner "core" function
local results, cats = p._information(args)
return results .. cats
end
return p