Jump to content
Toggle menu
  • 3 articles
  • 75 files
  • 7 users
  • 37.9K 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:Information: Difference between revisions

From Neodyland Wiki
mw-content-{ltr,rtl} is deprecated since 2022 https://phabricator.wikimedia.org/T287701 and now with https://gerrit.wikimedia.org/r/q/0a6efabf is not needed for the bullets placement also
No edit summary
 
(3 intermediate revisions by 2 users not shown)
Line 25: Line 25:
-- ==================================================
-- ==================================================


local function langWrapper(text, textLang)
-- code equivalent to https://commons.wikimedia.org/wiki/Template:Description
local language = mw.language.new( textLang )
local dir      = language:getDir() 
local LangName = language:ucfirst(mw.language.fetchLanguageName( textLang, textLang))
local str = mw.ustring.format('<span class="language %s"><b>%s:</b></span>', textLang, LangName)
    return mw.ustring.format('<div class="description" dir="%s" lang="%s">%s %s</div>', dir, textLang, str, text)
end
-------------------------------------------------------------------------------
local function getBareLabel(id, userLang)
-- code equivalent to require("Module:Wikidata label")._getLabel with Wikidata=- option
local label, link
-- build language fallback list
local langList = mw.language.getFallbacksFor(userLang)
table.insert(langList, 1, userLang)
for _, lang in ipairs(langList) do  -- loop over language fallback list looking for label in the specific language
label = mw.wikibase.getLabelByLang(id, lang)
if label then break end                    -- label found and we are done
end
return label or id
end


-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Line 126: Line 104:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- _information function creates a wikicode for {{Information}} template based on
-- _information function creates a wikicode for {{Information}} template based on
-- passed arguments (through "args") and data extracted from SDC. Allowed fields of  
-- passed arguments (through "args"). Allowed fields of  
-- "args" are : 'description', 'date', 'permission', 'author', 'other_versions',   
-- "args" are : 'description', 'date', 'permission', 'author', 'other_versions',   
-- 'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo' and 'lang'
-- 'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo' and 'lang'
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Dependencies: p._SDC_Description, p._SDC_Source, p._SDC_Author, p._SDC_Date,
-- Dependencies: Build_html, Module:ISOdate (_date)
--    Build_html, Module:ISOdate (_date)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
function p._information(args)
function p._information(args)
Line 145: Line 122:
if namespace==6 or namespace==10 then
if namespace==6 or namespace==10 then
local allowedFields = {'description', 'date', 'permission', 'author', 'other_versions',   
local allowedFields = {'description', 'date', 'permission', 'author', 'other_versions',   
'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo', 'lang', 'strict','sdc'}
'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo', 'lang', 'strict'}
local set, badField = {}, {}
local set, badField = {}, {}
for _, field in ipairs(allowedFields) do set[field] = true end
for _, field in ipairs(allowedFields) do set[field] = true end
Line 154: Line 131:
end
end
if #badField>0 then
if #badField>0 then
cats = mw.ustring.format('\n;<span style="color:var(--color-error,red)">Error in [[Template:Information|{{Information}}'..
cats = mw.ustring.format('\n;<span style="color:var(--color-error,red)">Error in [[Template:Information|Information'..
' template]]: unknown parameter "%s".</span>',  table.concat(badField,'", "'))
' template]]: unknown parameter "%s".</span>',  table.concat(badField,'", "'))
cats = cats .. '\n[[Category:Pages using Information template with incorrect parameter]]'
cats = cats .. '\n[[Category:Pages using Information template with incorrect parameter]]'
Line 166: Line 143:
args.namespace = namespace
args.namespace = namespace


-- ====================================================
-- === harvest structured data                      ===
-- ====================================================
local entity = mw.wikibase.getEntity()
if namespace==6 then
entity = mw.wikibase.getEntity()
elseif args.sdc then
entity = mw.wikibase.getEntity(args.sdc)
end
if (namespace==6 or args.sdc) and entity then -- file namespace
-- call SDC functions only when needed
local icon = true
-- local field is missing -> get it from SDC
args.description = args.description or p._SDC_Description(entity, lang, icon) 
args.source      = args.source      or p._SDC_Source(entity, lang, icon)
args.author      = args.author      or p._SDC_Author(entity, lang, icon)
args.date        = args.date        or p._SDC_Date(entity, lang, icon)
end
-- ====================================================
-- ====================================================
Line 218: Line 176:
end
end


-------------------------------------------------------------------------------
-- interface for other Lua codes to 5 functions for extracting description, source,
-- author, date and location information from SDC.
-- INPUTS:
--  - "entity" - structure created by mw.wikibase.getEntity function
--  - "lang"  - users language
-------------------------------------------------------------------------------
-- Dependencies: langWrapper
-------------------------------------------------------------------------------
function p._SDC_Description(entity, lang, icon)
-- create {{en|1=...}} template with SDC's caption
local description, _
if entity and entity.labels then -- get label in users language or one of that language fallback list
local label = core.langSwitch(entity.labels, lang)
local labels, D = {}, {}
if label then -- show either matching language
labels[lang] = label
else -- or if missing then show all
labels = entity.labels
end
for _, label in pairs(labels) do -- add {{en|1=....}} like wrapper
if icon and #D==0 then -- add editAtSDC icon to the first description
label.value = label.value .. core.editAtSDC('ooui-php-4', lang)
end
table.insert(D, langWrapper(label.value, label.language, lang))
end
description = table.concat(D, '\n')
end
return description
end
-------------------------------------------------------------------------------
-- Dependencies: Module:Wikidata_date "_date" function, Module:ISOdate "_ISOdate" function
-------------------------------------------------------------------------------
function p._SDC_Date(entity, lang, icon)
-- get creation date from  P571 (inception)
-- Code can handle YYYY-MM-DD, YYYY-MM, and YYYY dates without any additional resources
-- But can load [[Module:Wikidata date]] if needed
local Date
if entity and entity.claims and entity.claims.P571 then
local snak = entity.claims.P571[1].mainsnak
if (snak.snaktype == "value") then
local v = snak.datavalue.value
if v and (v.calendarmodel=='http://www.wikidata.org/entity/Q1985727') and (mw.ustring.sub(v.time,1,1)=='+') then
if v.precision >= 11 then            -- day
Date = mw.ustring.sub(v.time,2,11)  -- date in YYYY-MM-DD format
elseif v.precision == 10 then        -- month
Date = mw.ustring.sub(v.time,2,8)    -- date in YYYY-MM format
elseif v.precision == 9 then        -- year
Date = mw.ustring.sub(v.time,2,5)    -- date in YYYY format
end
if Date then -- translate
Date = ISOdate(Date, lang, '', 'dtstart', '100-999')
end
end
end
if entity.claims.P571[1].qualifiers then                  -- non-trivial case: call heavy cavalery
local getDate = require("Module:Wikidata date")._date -- lazy loading: load only if needed
local result  = getDate(entity, 'P571', lang)        -- display the date in user's language
Date = result.str
end
end
if icon and Date then
Date = Date .. core.editAtSDC('P571', lang)
end
return Date
end
-------------------------------------------------------------------------------
-- Dependencies: none
-------------------------------------------------------------------------------
function p._SDC_Source(entity, lang, icon)
-- get source from P7482 (source of file)
-- Code can handle {{Own}} template and URLs
local source, label
if entity and entity.claims and entity.claims.P7482 then
for _,statement in ipairs(entity.claims.P7482) do
if statement.mainsnak.datavalue then
-- get URL is source  is " file available on the internet (Q74228490) "
if statement.mainsnak.datavalue.value.id=='Q74228490' and statement.qualifiers and statement.qualifiers.P973 then
source = statement.qualifiers.P973[1].datavalue.value -- described at URL
if statement.qualifiers.P137 then -- "operator"
local id = statement.qualifiers.P137[1].datavalue.value.id
label = getBareLabel(id, lang)
source  = '[' .. source ..' ' .. label ..']'
end
end
-- add {{tl|own}} if source is "original creation by uploader (Q66458942)"
if statement.mainsnak.datavalue.value.id=='Q66458942' then
label = mw.message.new( 'Wm-license-own-work'):inLanguage(lang):plain()
source = mw.ustring.format('<span class="int-own-work" lang="%s">%s</span>',lang, label)
end
-- add {{tl|Own work by the original uploader}} if source is " Own work by the original uploader (Q87402110)"
if statement.mainsnak.datavalue.value.id=='Q87402110' then
label  = getBareLabel('Q87402110', lang)
source = mw.ustring.format('<span class="int-own-work" lang="%s">%s</span>',lang, label)
end
if source then
break
end
end
end
end
if icon and source then
source = source .. core.editAtSDC('P7482', lang)
end
return source
end
-------------------------------------------------------------------------------
-- Dependencies: Module:Core "getLabel" function
-------------------------------------------------------------------------------
function p._SDC_Author(entity, lang, icon)
-- get author from P170 (creator)
-- Code can handle usuall cases of "[[User:Example|Example]]" as well as users with Wikidata Item IDs
local author
if entity and entity.claims and entity.claims.P170 then
local creators = {}
for _,statement in ipairs(entity.claims.P170) do
if statement.mainsnak.snaktype == "value" then  -- Creator has item ID   
local val = statement.mainsnak.datavalue.value.id
table.insert(creators, core.getLabel(val, lang))
elseif statement.mainsnak.snaktype == "somevalue" then -- Creator defined by username
if statement.qualifiers then -- author name string (P2093)
    local qual = {}
local properties = {P2093='authorStr', P4174='username', P3831='role', P2699='url'}
for prop, field in pairs( properties ) do
if statement.qualifiers[prop] then
qual[field] = statement.qualifiers[prop][1].datavalue.value
end
end
local role = ''
if qual.role and entity.claims.P170[2] then -- add role only is multiple creators
role = '&nbsp;(' .. core.getLabel(qual.role.id, lang) .. ')'
end
if qual.username and qual.authorStr then        --    author name string (P2093) & Wikimedia username (P4174)
table.insert(creators, '[[User:'..qual.username..'|'..qual.authorStr..']]'..role)
elseif qual.username and not qual.authorStr then -- no author name string (P2093) & Wikimedia username (P4174)
table.insert(creators, '[[User:'..qual.username..'|'..qual.username..']]'..role)
elseif qual.url and qual.authorStr then          --    author name string (P2093) & URL (P2699)
table.insert(creators, '['..qual.url..' '..qual.authorStr..']'..role)
elseif qual.url and not qual.authorStr then      -- no author name string (P2093) & URL (P2699)
table.insert(creators, qual.url..role)
elseif  qual.authorStr then                      --    author name string (P2093)
table.insert(creators, qual.authorStr..role)
end
end
end
end -- end for
author = table.concat(creators, ', ')
end
if icon and author then
author = author .. core.editAtSDC('P170', lang)
end
return author
end
-------------------------------------------------------------------------------
-- Dependencies: Module:Code "getLabel" function
-------------------------------------------------------------------------------
function p._SDC_Location(entity, lang, icon)
-- get location  P276 (location)
local location, prop
if entity and entity.claims and entity.claims.P1071 then
local snak = entity.claims.P1071[1].mainsnak
if (snak.snaktype == "value") then
location = core.getLabel(snak.datavalue.value.id, lang)
prop = 'P1071'
end
end
if entity and entity.claims and entity.claims.P276 then
local snak = entity.claims.P276[1].mainsnak
if (snak.snaktype == "value") then
location = core.getLabel(snak.datavalue.value.id, lang)
prop = 'P276'
end
end
if icon and location then
location = location .. core.editAtSDC(prop, lang)
end
return location
end


-- ===========================================================================
-- ===========================================================================
Line 407: Line 183:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- information function creates a wikicode for {{Information}} template based on
-- information function creates a wikicode for {{Information}} template based on
-- passed arguments (through "frame") and data extracted from SDC. Allowed template
-- passed arguments (through "frame"). Allowed template
-- arguments are : 'description', 'date', 'permission', 'author', 'other_versions',   
-- arguments are : 'description', 'date', 'permission', 'author', 'other_versions',   
-- 'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo', 'sdc' and 'lang'.  
-- 'source','other_fields', 'other_fields_0', 'other_fields_1', 'demo' and 'lang'.  
-- All inputs do not depend on capitalization and all "_" can be replaced with spaces.
-- All inputs do not depend on capitalization and all "_" can be replaced with spaces.
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Line 420: Line 196:
end
end


-------------------------------------------------------------------------------
-- interface for templates to 5 functions for extracting description, source,
-- author, date and location information from SDC.
-- INPUTS (templaate parameters):
--  * "mid"  - pageID defining a file. Optional, defaulting to the current file.
--  * "lang"  - users language. Optional defaulting to the language of the user
--  * "icon"  - add "Edit this at Wikidata" icon? boolean ( 'true'/'false', 'yes'/'no', 1/0
-------------------------------------------------------------------------------
-- Dependencies: getEntity
-------------------------------------------------------------------------------
local function parseFrame(frame)
local args = core.getArgs(frame)
local entity = mw.wikibase.getEntity( args.mid )
local icon  = core.yesno(args.icon, true)
return {entity, args.lang, icon}
end
function p.SDC_Description(frame)
return p._SDC_Description(unpack(parseFrame(frame)))
end
function p.SDC_Source(frame)
return p._SDC_Source(unpack(parseFrame(frame)))
end
function p.SDC_Author(frame)
return p._SDC_Author(unpack(parseFrame(frame)))
end
function p.SDC_Date(frame)
return p._SDC_Date(unpack(parseFrame(frame)))
end
function p.SDC_Location(frame)
return p._SDC_Location(unpack(parseFrame(frame)))
end


return p
return p
Line 463: Line 203:
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- information
-- information
-- SDC_Description
-- SDC_Source
-- SDC_Author
-- SDC_Date
-- SDC_Location
Cookies help us deliver our services. By using our services, you agree to our use of cookies.