Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be bug-free and ready for use wherever appropriate. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
The backend of template:Self. It combines the code of the following templates:
Following MediaWiki messages are used:
Unused messages created for phab:T40576:
{{#invoke:Self|main}}
-- .___ ___. ______ _______ __ __ __ _______ _______. _______ __ _______
-- | \/ | / __ \ | \ | | | | | | | ____| _ / || ____|| | | ____|
-- | \ / | | | | | | .--. || | | | | | | |__ (_) | (----`| |__ | | | |__
-- | |\/| | | | | | | | | || | | | | | | __| \ \ | __| | | | __|
-- | | | | | `--' | | '--' || `--' | | `----.| |____ _.----) | | |____ | `----.| |
-- |__| |__| \______/ |_______/ \______/ |_______||_______|(_)_______/ |_______||_______||__|
-- Written by [[user:jarekt]]
-- Original Template:Self used the following templates and modules:
-- * Template:Dir
-- * Template:Lang
-- * Template:License migration is redundant
-- * Template:License migration is redundant multiple
-- * Template:Self/is-pd-expired
-- * Template:SDC statement exist
-- * Module:SDC tracking
require('strict') -- used for debugging purposes as it detects cases of unintended global variables
local p = {}
-------------------------------------------------------------------------------
local function normalize_input_args(input_args, output_args)
for name, value in pairs( input_args ) do
value = mw.text.trim(value) -- trim whitespaces from the beggining and the end of the string
if value ~= '' then -- nuke empty strings
if type(name)=='string' then
name = string.lower(name)
end
output_args[name] = value
end
end
return output_args
end
-------------------------------------------------------------------------------
local function startswith(name, str)
-- test if strings starts with "str"
return (string.sub(name,1,string.len(str))==str)
end
-------------------------------------------------------------------------------
local function license_migration_is_redundant(name)
-- Lua version of Template:License migration is redundant
name = string.lower(name)
return (startswith(name, 'cc-by-3.0' )
or startswith(name, 'cc-by-sa-3.0')
or name=='cc-by-4.0' or name=='cc-by-all'
or name=='cc-by-sa-4.0' or name=='cc-by-sa-all'
or name=='cc-by-sa-any' or name=='cc-by-sa-1.0+'
or name=='cc-by-sa-2.0+' or name=='cc-by-sa-4.0,3.0,2.5,2.0,1.0')
end
-------------------------------------------------------------------------------
local function pd_is_expired(name)
-- Lua version of [[Template:Self/is-pd-expired]]
name = string.lower(name)
return (startswith(name, 'pd-us-') or startswith(name, 'pd-old') or startswith(name, 'pd-anon')
or name=='pd-us' or name=='pd-1923' or name=='pd-canada-anon' or name=='anonymous-eu')
end
-------------------------------------------------------------------------------
function p.main(frame)
-- parse inputs
local args = {}
args = normalize_input_args(frame:getParent().args, args)
args = normalize_input_args(frame.args, args)
local lang = args.lang or frame:callParserFunction("int","lang") -- get user's chosen language
local dir = mw.language.new( lang ):getDir() -- get text direction
local page = mw.title.getCurrentTitle()
local namespace = page.namespace -- get page namespace
local author = args.author
-- evaluate numbered inputs
local tag = {}
local ntag = 0 -- will count numbered inputs
local pd_expired = false -- Do we have any public domain tags due to expiration
local redundant = false
for name, value in pairs( args ) do -- loop through numbered variables
if (type(name)=='number' and value~='Self') then
ntag = ntag+1
tag[ntag] = value
pd_expired = pd_expired or pd_is_expired(tag[ntag])
redundant = redundant or license_migration_is_redundant(tag[ntag])
end
end
-- One of the tags indicate public domain work not released by the author
local output, cats = {}, {}
local msg
if pd_expired then
msg = mw.message.new( 'wm-license-self-invalid-parameter'):inLanguage(lang):plain()
msg = mw.ustring.format('<div class="error" style="text-align:center; font-weight:bold;">%s</div>', msg)
table.insert(output, msg)
table.insert(cats, '[[Category:Files with invalid parameter in Self template]]')
end
-- get proper header, like ("I, the copyright holder of this work, hereby publish it under the following license:")
if (ntag>1 and author) then
msg = mw.message.new( 'wm-license-self-multiple-licenses-with-author', author)
elseif (ntag==1 and author) then
msg = mw.message.new( 'wm-license-self-one-license-with-author', author)
elseif (ntag>1) then -- no author
msg = mw.message.new( 'wm-license-self-multiple-licenses')
else -- ntag==1 and no author
msg = mw.message.new( 'wm-license-self-one-license')
end
msg = msg:inLanguage(lang):plain()
local lang_fmt = '<div lang="%s" dir="%s" class="description %s" style="display:inline;">%s</div>'
msg = mw.ustring.format(lang_fmt, lang, dir, lang, msg)
msg = mw.ustring.format('<div class="center" style="font-weight:bold;">%s</div>', msg)
table.insert(output, msg)
-- render license templates
local sargs = {}
sargs.attribution = args.attribution or author
sargs.migration = args.migration
if not args.migration and redundant then
sargs.migration='redundant'
end
for i=1,ntag do
table.insert(output, frame:expandTemplate{ title = tag[i], args=sargs } )
end
-- extra message if multiple templates present ("You may select the license of your choice.")
if (ntag>1) then
msg = mw.message.new( 'wm-license-self-multiple-licenses-select'):inLanguage(lang):plain()
msg = mw.ustring.format(lang_fmt, lang, dir, lang, msg)
msg = mw.ustring.format('<div class="center">%s</div>', msg)
table.insert(output, msg)
end
-- assemble the final template and save as string
local results = table.concat(output,'\n')
msg = '<div style="clear:both; margin:0.5em auto; background-color:var(--background-color-interactive,#eaecf0); color:inherit; border:2px solid var(--border-color-subtle,#c8ccd1); padding:8px; direction:%s; " class="licensetpl_wrapper">%s</div>'
results = mw.ustring.format(msg, dir, results)
-- If used in files then add some categories if needed
if namespace==6 then
table.insert(cats, '[[Category:Self-published work]]')
local entity = mw.wikibase.getEntity()
-- check if SDC statement exist
if not(entity and entity.statements and entity.statements['P275']) then
table.insert(cats, '[[Category:Self-published work missing SDC copyright license]]')
end
results = results .. table.concat(cats) -- add categories only to files
end
return results
end
return p