モジュールの解説[表示] [編集] [履歴] [キャッシュを破棄]

require('strict')
local p = {}
local configfile = 'Module:Authority control/config' -- default configuation module
local arg = mw.getCurrentFrame().args.config
if arg and arg~='' then
 configfile = 'Module:Authority control/config/' .. arg
end
local config
if mw.title.new(configfile).exists then
 config = mw.loadData(configfile)
else
 return error('Invalid configuration file',0)
end
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = title.subpageText == config.i18n.testcases
local makelink = require(config.i18n.ACmodule).makelink
local lang = mw.getContentLanguage()

local function needsAttention(sortkey)
 return '[[' .. config.i18n.category .. ':' .. config.i18n.attentioncat .. '|' .. sortkey .. title.text .. ']]'
end

local function addCat(cat,sortkey)
 if cat and cat ~= '' and (namespace == 0 or namespace == 14 or testcases) then
  local redlinkcat = ''
  if testcases == false and mw.title.new(cat, 14).exists == false then
   redlinkcat = needsAttention('N')
  end
  if sortkey then
   cat = '[[' .. config.i18n.category .. ':'..cat..'|' .. sortkey .. title.text .. ']]'
  else
   cat = '[[' .. config.i18n.category .. ':'..cat..']]'
  end
  cat = cat .. redlinkcat
  return cat
 else
  return ''
 end
end

-- Creates a human-readable standalone wikitable version of conf, and tracking categories with page counts, for use in the documentation
function p.docConfTable(frame)
 local function checkcat(category,label)
  local ret='[[:Category:'..category..'|'..label..']]'
  --if mw.title.new(category,14).exists == false then
   --ret = ret..' <span class="plainlinks" style="font-size:85%;">&#91;['..tostring(mw.uri.fullUrl('Category:'..category,'action=edit&preload=Template:Authority_control/preload'))..' 作成]&#93;</span>'
  --end
  return ret
 end
 local doc = ''
 local a, P, f = 0, 0, 0 --cumulative sums
 local count = frame.args.count or false
 local columns = 3 + (count and 1 or 0)
 local row = function(conf)
  local category = conf.category or conf[1]
  local articleCat = string.format(config.i18n.cat,category)
  local articleCount = mw.site.stats.pagesInCategory(articleCat,config.i18n.pages)
  local errorCat = conf.errorcat or string.format(
   config.i18n.cat,
   config.i18n.faulty .. category
  )
  local errorCount =  mw.site.stats.pagesInCategory(errorCat,config.i18n.pages)
  P = P + 1 --property count
  a = a + articleCount
  f = f + errorCount
  local getstatement = function(id,propid,qualid)
   local statement = mw.wikibase.getBestStatements('P' .. id, 'P' .. propid)
   local value
   if statement and statement[1] and statement[1].mainsnak.datavalue.value.id then
    value = statement[1].mainsnak.datavalue.value.id
    local qual
    if qualid and statement[1].qualifiers['P' .. qualid][1].datavalue.value then
     qual = statement[1].qualifiers['P' .. qualid][1].datavalue.value
    end
    return value, qual
   end
  end
  local _, example = getstatement(conf.property, 1855, conf.property)
  if not example then example = '' end
  example = frame:expandTemplate{title = "Hlist", args = {'\n' .. makelink(conf,{id=example},1)}} .. '\n'
  local getname = function(nameprop)
   local name = getstatement(conf.property,nameprop)
   if name then
    return frame:expandTemplate{title='Wikidata fallback link',args={name}}
   end
  end
  local name = getname(1629) or getname(10726) or getname(9073) or getname(2378) or ''
  local out = ''
  if conf.remark then
   out = out .. '<tr><td rowspan=2>'
  else
   out = out .. '<tr><td>'
  end
  out = out .. name .. '</td>' ..
   '<td style="text-align: center">' .. config.sections[conf.section].name .. '</td>' ..
   '<td data-sort-value=' .. conf.property .. '>' .. frame:expandTemplate{title='Wikidata property link',args={id='f',conf.property}} .. '</td>' ..
   '<td>' .. example .. '</td>'
  if count then
   out = out .. '<td style="text-align: right;">'..checkcat(articleCat,lang:formatNum(articleCount))..' ('..checkcat(errorCat,errorCount)..')</td>'
  end
  out = out .. '</tr>'
  if conf.remark then
   out = out .. "<tr class='expand-child'><td colspan=" .. columns .. ">'''Remarks:''' " .. frame:preprocess{text = conf.remark} .. "</td></tr>"
  end
  return out
 end
 local doc = '<table class="wikitable sortable">' ..
   '<tr><th>' .. config.i18n.identifier .. '</th>' ..
   '<th>' .. config.i18n.Section .. '</th>' ..
   '<th data-sort-type=number>' .. config.i18n.WDproperty .. '</th>' ..
   '<th>' .. config.i18n.Appears_as .. '</th>'
 if count then
   doc = doc .. '<th>[[:' .. config.i18n.category .. ':' .. config.i18n.maincat .. '|' .. config.i18n.numofarticles .. ']] '
    .. '([[:' .. config.i18n.category .. ':' .. config.i18n.faultcat .. '|' .. config.i18n.Faults .. ']])</th>'
 end
 doc = doc .. '</tr>'
 for _, conf in pairs(config.config) do
  doc = doc .. row(conf)
 end
 if count then
  doc = doc .. '<tr><th style="text-align: right;" colspan=' .. columns-1 .. '>' .. config.i18n.Totals .. '</th>' ..
   '<th style="text-align: right;">' .. P .. '</th>' ..
   '<th style="text-align: right;">' .. lang:formatNum(a) .. ' ([[:' .. config.i18n.category .. ':' .. config.i18n.allfaultycat .. '|' .. f .. ']])</th></tr>'
 end
 doc = doc .. '</table>'
 return doc
end

function p.errorTable(frame)
 local Table = '<table class="wikitable sortable">'..
   '<tr><th>' .. config.i18n.WDproperty .. '</th>'..
   '<th>' .. config.i18n.faulty .. config.i18n.identifiers .. '</th>'..
   '<th>[[:' .. config.i18n.category .. ':' .. config.i18n.faultcat .. '|' .. config.i18n.Tracking_category .. ']]</th></tr>'
 local f, P = 0, 0, 0 --cumulative sums
 for _, conf in pairs(config.config) do
  local category = conf.errorcat or string.format(
   config.i18n.cat,
   config.i18n.faulty .. (conf.category or conf[1])
  )
  local count =  mw.site.stats.pagesInCategory(category,config.i18n.pages)
  if count > 0 then
   P = P + 1
   f = f + count
   Table = Table..'<tr><td>'..frame:expandTemplate{ title = config.i18n.linktemplate, args = { id = 'f', conf.property } } .. '</td>'..
    '<td style="text-align:center;">'..tostring(count)..'</td>'..
    '<td>[[:' .. config.i18n.category .. ':'..category..']]</td></tr>'
  end
 end
 Table = Table..'<tr><th>' .. config.i18n.Totals .. '</th>'..
  '<th style="text-align:center;">' .. '[[:' .. config.i18n.category .. ':' .. config.i18n.allfaultycat .. '|' .. tostring(f) .. ']]</th>'..
  '<th style="text-align:center;">'..tostring(P)..'</th></tr></table>'
 return Table
end

function p.whitelisttable(frame)
 local Table = '<table class="wikitable sortable">'..
   '<tr><th>' .. config.i18n.Code .. '</th>'..
   '<th>' .. config.i18n.Topic .. '</th>'..
   '<th>' .. config.i18n.identifiers .. '</th></tr>'
 for code, wlist in pairs(config.whitelists) do
  Table = Table .. '<tr><th>' .. code .. '</th>'..
   '<td>[[' .. mw.wikibase.getSitelink('Q' .. wlist.topic) .. ']]</td>'
  local plist = {}
  for _, property in pairs(wlist.properties) do
   table.insert(plist,frame:expandTemplate{title='Wikidata property link', args={'P' .. property}})
  end
  Table = Table .. '<td>' .. table.concat(plist,', ') .. '</td></tr>'
 end
 Table = Table .. '</table>'
 return Table
end

function p.sectiontable(frame)
 local Table = '<table class="wikitable sortable">'..
   '<tr><th>' .. config.i18n.section_num .. '</th>' ..
   '<th>' .. config.i18n.Description .. '</th>'..
   '<th>' .. config.i18n.identifiers .. '</th></tr>'
 for number,section in ipairs(config.sections) do
  Table = Table .. '<tr><th>' .. number .. '</th>' .. '<td>' .. section.name .. '</td>'
  local plist = {}
  for _,id in pairs(config.config) do
   if id.section == number then
    table.insert(plist,frame:expandTemplate{title=config.i18n.linktemplate, args={'P' .. id.property}})
   end
  end
  Table = Table .. '<td>' .. table.concat(plist,', ') .. '</td></tr>'
 end
 Table = Table .. '</table>'
 return Table
end

-- Main/External Call for Pages with authority control identifiers
function p.autoDetect(frame)
 local function whichTOC(frame)
  local pageCount = mw.site.stats.pagesInCategory(title.text, config.i18n.pages)
  if pageCount >= 5000 then
   return frame:expandTemplate{ title = 'CategoryTOC6' }
  elseif pageCount > 400 then
   return frame:expandTemplate{ title = 'CategoryTOC5' }
  end
  return ''
 end
 local function wpa(frame,id,faulty)
  -- 日本語版独自: カテゴリに対応する識別子が存在しない場合の動作
  local outString = frame:expandTemplate{ title = 'Wikipedia category', args = { hidden = 'yes', tracking = 'yes' } }
   .. frame:expandTemplate{ title = 'Possibly empty category' }
  local name = nil
  for _, conf in pairs(config.config) do
   if conf.category == id or conf[1]:lower() == id:lower() then
    local getname = function(nameprop)
     local name = mw.wikibase.getBestStatements('P'..conf.property,nameprop)
     if name and name[1] and name[1].mainsnak.datavalue.value.id then
      return frame:expandTemplate{title='Wikidata fallback link',args={name[1].mainsnak.datavalue.value.id}}
     end
    end
    -- Unlike enwiki, 'name' is defined outside of the loop
    name = getname('P1629') or getname('P10726') or getname('P9073') or getname('P2378') or ''
    if mw.ustring.find(name, '識別子]]', 1, true) or mw.ustring.find(name, 'ID]]', 1, true) then
    else
     name = name .. '識別子'
    end
    outString = outString
        .. frame:expandTemplate{ title = 'Category explanation', args = {name..'がある記事を収集しています。手動で[[Help:カテゴリ#サブカテゴリ|サブカテゴリ]]を追加しないでください。'} }
     .. frame:expandTemplate{ title = 'Cat more', args = {'Wikipedia:典拠管理', ':d:Property:P'..conf.property} }
     .. '\n' .. whichTOC( frame )
    break
   end
  end
  if not name then
   outString = outString .. needsAttention('W')
  end
  if faulty then
   outString = outString .. addCat(config.i18n.faultcat,id) .. addCat(string.format(config.i18n.cat, id), ' ')
  else
   outString = outString .. addCat(config.i18n.maincat,id)
  end
  return outString
 end
 if namespace == 14 then --cat space
  local wpfaultyID = mw.ustring.match(title.text, "誤った([%w%.%-'・ ]+)識別子が指定されている記事")
  local wpID = mw.ustring.match(title.text, "([%w%.%-'・ ]+)識別子が指定されている記事")
  if wpfaultyID then
   return wpa(frame,wpfaultyID,true)-- must be before wpID check, in case they both match
  elseif wpID then
   return wpa(frame,wpID,false)
  else
   return needsAttention('U')
  end
 end
end

function p.idproposal(frame)
 local property = frame.args.property or ''
 local out = '<ul><li>Wikidata property: ' .. frame:expandTemplate{title='Wikidata property link', args={'P' .. property}} .. '</li>'
 out = out .. '<li>Section: '
 local section = frame.args.section or ''
 if section~='' then
  out = out .. config.sections[section].name .. ' (' .. section .. ')'
 else
  out = out .. 'Not specified'
 end
 out = out .. '</li><li>Link: '
 local link = frame.args.link or ''
 if link=='' then
  link = mw.wikibase.getBestStatements('P'..property,'P1630') or ''
  link = link[1].mainsnak.datavalue.value
 end 
 if link~='' then
  out = out .. '<code>' .. link .. '</code>'
 else
  out = out .. 'Not specified'
 end
 out = out .. '</li><li>Label: '
 local label = frame.args.label or ''
 if label~='' then
  out = out .. label
 else
  out = out .. 'Not specified'
 end
 out = out .. '</li><li>Example: '
 local example = mw.wikibase.getBestStatements('P'..property,'P1855') or ''
 if example then
  example = example[1].qualifiers['P'..property][1].datavalue.value
  example = frame:expandTemplate{title = "Hlist", args = {'\n' .. makelink({[1]='',link=link,label=label},{id=example},1)}} .. '\n'
  out = out .. example
 else
  out = out .. 'Not available'
 end
 out = out .. '</li></ul>'
 return out
end

return p