Modul:Reference score
Fra EverybodyWiki Bios & Wiki
Dokumentasjon for denne modulen kan opprettes på Modul:Reference score/dok
---Module for chosing the best reference.
--@table for localization
local i18n = mw.loadData( 'Module:Reference score/i18n' )
-- @table for configuration
local conf = mw.loadData( 'Module:Reference score/conf' )
-- @table for export
local h = {}
--- Make a list of categories.
-- Note this probably should be moved out of this module.
-- @tparam number num of references
-- @treturn table of strings
function h.makeCategories( num )
local t = {}
if num and num > 0 then
table.insert( t, mw.message.newRawMessage( i18n['category-pages-using-references-from-statement'] ):plain() )
if num == 1 then
table.insert( t, mw.message.newRawMessage( i18n['category-pages-using-single-reference-from-statement'] ):plain() )
elseif num > 1 then
table.insert( t, mw.message.newRawMessage( i18n[string.format('category-pages-using-%d-references-from-statement', num )] ):plain() )
end
end
return t
end
--- Generate a language score for the claims.
-- @tparam table claims to process
-- @treturn number best score
function h.scoreLanguage( claims )
local keep = conf.lowScore
for _,v in ipairs( claims ) do
if v.snaktype == 'value'
and v.datatype == 'monolingualtext'
and v.datavalue.type == 'monolingualtext' then
local score = conf.languageScore[v.datavalue.value.language]
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
end
return keep
end
--- Generate a root domain score for the claims.
-- @tparam table claims to process
-- @treturn number best score
function h.scoreDomain( claims )
local keep = conf.lowScore
for _,v in ipairs( claims ) do
if v.snaktype == 'value'
and v.datatype == 'url'
and v.datavalue.type == 'string' then
local uri = mw.uri.new( v.datavalue.value )
local root = string.match( uri.host, '%.([^.]+)$' )
local score = conf.domainScore[root]
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
end
return keep
end
--- Generate an entity score for the claims.
-- @tparam table claims to process
-- @treturn number best score
function h.scoreEntity( claims )
local keep = conf.lowScore
for _,v in ipairs(claims) do
if v.snaktype == 'value'
and v.datatype == 'wikibase-item'
and v.datavalue.type == 'wikibase-entityid' then
local score = conf.entityScore[v.datavalue.value.id]
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
end
return keep
end
--- Generate a property score for the claims.
-- @tparam table claims to process
-- @treturn number best score
function h.scoreProperty( claims )
local keep = conf.lowScore
for _,v in ipairs(claims) do
-- strictly speaking this could be dropped as all should be equal
local score = conf.propertyScore[v.property]
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
return keep
end
--- Generate scores for the references.
-- Note that the generated list is sparse, and is using false as marker.
-- @tparam table list to process
-- @treturn table of references
function h.score( list )
-- make sure we have a continuous target list
local t = {}
for i=1,conf.lowScore do
t[i] = false
end
-- loop over the source list
for _,v in ipairs( list ) do
-- is the reference excluded?
local exclude = false
for _,w in ipairs( conf.exclude ) do
if v.snaks and v.snaks[w] then
exclude = true
break
end
end
-- only process included (ie not excluded) references
if not exclude then
local keep = conf.lowScore
-- try language of "title"
if v.snaks.P1476 then
local score = h.scoreLanguage(v.snaks.P1476)
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
-- try root domain of "reference url"
if v.snaks.P854 then
local score = h.scoreDomain(v.snaks.P854)
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
-- try reference to entity
for _,w in pairs(v.snaks) do
local score = h.scoreEntity( w )
if score then
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
end
-- some properties that usually imply somewhat quality
for _,w in pairs(v.snaks) do
local score = h.scoreProperty( w )
-- note that higher number means lower prority
keep = (keep < score) and keep or score
end
table.insert( t, keep, v )
end
end
return t
end
--- Compact the sparse list.
-- Note that the input list is sparse, and using false as marker.
-- @tparam table list of any
-- @tparam[limit=conf.maxRefs] nil|number limit for truncation of list
-- @treturn table
function h.compact( list, limit )
limit = limit or conf.maxRefs
local t = {}
local counter = 0
for _,v in ipairs( list ) do
if v then
counter = counter + 1
if limit and counter <= limit then
table.insert( t, v )
elseif not limit then
table.insert( t, v )
end
end
end
return t
end
--- Render references.
-- @tparam table frame
-- @tparam table list of references
-- @treturn string
function h.render( frame, list )
local scored = h.score( list or {} )
local compacted = h.compact( scored )
local wiki = ''
local hits = 0
for i,v in ipairs( compacted ) do
hits = hits + 1
local keys = {}
for k,_ in pairs( v.snaks ) do
table.insert( keys, k )
end
local snaks = {}
for _,k in pairs( mw.wikibase.orderProperties( keys ) ) do
-- lua keeps injection order
snaks[k] = v.snaks[k]
end
-- hash will merge similar entries
local content = mw.wikibase.formatValues( snaks )
local attrs = { name = string.format( 'hash-%s', v.hash ) }
wiki = wiki .. frame:extensionTag( 'ref', content, attrs )
end
--for _,v in ipairs( h.makeCategories( hits ) ) do
-- wiki = wiki .. mw.ustring.format('[[Category:%s]]', v )
--end
return wiki
end
return h