|
|
| (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 = ' (' .. 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
| |