انتقل إلى المحتوى

مودول:ضبط مخازني

من ويكيپيديا

الوصف

[بدل لكود]

هذا القالب يربط مقالات ويكيبيديا بمختلف أنظمة الفهرسة المكتبية، حيث يستخدم هذا القالب معظم بياناته من ويكي بيانات، ولكن ذلك يمكن تجاوزه عند إدخال البيانات في القالب.

أنواع البيانات

[بدل لكود]
ملفات الضبط الاستنادي المدعومة
ملف استنادي دولي افتراضي (VIAF)
رقم الضبط في مكتبة الكونغرس (LCCN)
المحدد المعياري الدولي للأسماء (ISNI)
هوية مفتوحة للباحثين والمساهمين (ORCID)
ملف استنادي متكامل (Gemeinsame Normdatei أو GND)
ليبريس by the المكتبة الوطنية السويدية (SELIBR)
النظام الجامعي للتوثيق (Système universitaire de documentation أو SUDOC)
مكتبة فرنسا الوطنية (Bibliothèque nationale de France أو BNF)
بوابة السيرة الذاتية  [لغات أخرى]‏ (Biografisch Portaal أو BPN)
معرف الباحث (RID)
BIBSYS (BIBSYS)
قائمة الاتحاد لأسماء الفنانين (ULAN)
ميوزك برينز (MBA)
المكتبة الوطنية الأسترالية (NLA)
مكتبة البرلمان الياباني الوطنية (NDL)
... (بالإضافة إلى أكثر من 30+ مصدر، انظر مودول:ضبط استنادي)

الاستخدام

[بدل لكود]
Empty (reliant wholly on Wikidata)
{{ضبط استنادي}}
Full
{{ضبط استنادي|VIAF=xxxxxx |LCCN=n/xx/xxxxxx |ISNI=xxxx xxxx xxxx xxxx |ORCID=xxxx-xxxx-xxxx-xxxx |GND=xxxxxx |SELIBR=xxxxxx |SUDOC=xxxxxxxxx |BNF=xxxxxx |BPN=xxxxx |RID=xxxxx |BIBSYS=xxxxx |ULAN=xxxxx |MBA=xxxxxx |NLA=xxxxxxx |NDL=xxxxxxxx}}
Blank
{{ضبط استنادي|VIAF= |LCCN= |ISNI= |ORCID= |GND= |SELIBR= |SUDOC= |BNF= |BPN= |RID= |BIBSYS= |ULAN= |MBA= |NLA= |NDL=}}

تصانيف

[بدل لكود]

تصانيف تتبع

ويكي بيانات

[بدل لكود]

The template can get its information from the following properties on ويكي بيانات:

معلمة نوع معرف الخاصية
VIAF ملف استنادي دولي افتراضي إدونتيفيكاتور مخازني ڤيرتوالي دولي (VIAF) (P214)
LCCN رقم الضبط في مكتبة الكونغرس إدونتيفيكاتور د لمكتابة د لكونڭريس (P244)
ISNI المحدد المعياري الدولي للأسماء إدونتيفيكاتور معياري دولي د السميات (ISNI) (P213)
ORCID هوية مفتوحة للباحثين والمساهمين إدونتيفيكاتور د ؤرسيد (ORCID) (P496)
GND ملف استنادي متكامل إدونتيفيكاتور د الضوسي لمخازني لمتكامل (GND) (P227)
SELIBR ليبريس إدونتيفيكاتور ديال لمكتابة لوطنية د السويد (LIBRIS) (P906)
SUDOC النظام الجامعي للتوثيق مُعرِّف النظام الجامعي للتوثيق (IdRef) (P269)
BNF مكتبة فرنسا الوطنية إدونتيفيكاتور د لمكتابة لوطنية لفرانساوية (BnF) (P268)
BPN بوابة السيرة الذاتية  [لغات أخرى] إدونتيفيكاتور ديال بوابة السيرة الداتية د هولاندا (P651)
ULAN قائمة الاتحاد لأسماء الفنانين إدونتيفيكاتور ديال الليستة د تيحاد سميات لفنانين (P245)
MBA MBID مُعرِّف فنَّان في موسوعة "ميوزيك برينز" (MusicBrainz) (P434)
NLA المكتبة الوطنية الأسترالية إدونتيفيكاتور ديال لمكتبة لوطنية لؤسطرالية (NLA) (P409)
NDL مكتبة البرلمان الياباني الوطنية مُعرِّف مكتبة البرلمان القومي الياباني (NDL) (P349)
BIBSYS BIBSYS إدونتيفيكاتور ديال نيضام الضبط لمخازني النورڤيجي (BIBSYS) (P1015)
RID RID إدونتيفيكاتور د لباحت (RID) (P1053)
RKDartists معهد هولندا لتاريخ الفن إدونتيفيكاتور د لباحت (RID) (P1053)
AUC AUC إدونتيفيكاتور د لباحت (RID) (P1053)

طالع ايضاً

[بدل لكود]

وصلات خارجية

[بدل لكود]
Maintenance reports


خواص ويكي بيانات المستخدمة في موضيل:ضبط استنادي
الخاصية وصفها تصنيف تتبع الاستخدام
مُعرِّف ملف الضبط الاستنادي الافتراضي الدَّولي (VIAF) (P214) (معرف خارجي) معرف قاعدة بيانات الملف للسلطة الافتراضية الدولية (VIAF) [الصيغة: حتى 22 رقما]

require('strict')
local p = {}
local frame = mw.getCurrentFrame()
local config_file = frame.args.config and frame.args.config~='' and ('/' .. frame.args.config) or ''
local config = mw.loadData('Module:Authority control/config' .. config_file)
local title = mw.title.getCurrentTitle()
local namespace = title.namespace
local testcases = title.subpageText == config.i18n.testcases
local getArgs = require('Module:Arguments').getArgs

local wikilink = function(target, label)
	return label and '[[' .. target .. '|' .. label .. ']]' or '[[' .. target .. ']]'
end

local needsAttention = function(sortkey)
	return wikilink(config.i18n.category .. ':' .. config.i18n.attentioncat, sortkey .. title.text)
end

local addCat = function(cat, sortkey)
	if cat and cat~='' and (namespace==0 or namespace==14 or testcases) then
		return wikilink(config.i18n.category..':'..cat, sortkey and sortkey..title.text)
	else
		return ''
	end
end

local tooltip = function(text, label)
	if label and label~='' then
		return frame:expandTemplate{
			title = 'Tooltip',
			args = {text, label}
		}
	else
		return text
	end
end

local _makelink = function(id, val, additional, qid) --validate values and create a link
	local link = mw.html.create('span'):addClass('uid')
	if not additional and id.prefix then --show prefix on primary value
		link:wikitext(id.prefix .. ': ')
	end
	local valid_value = false
	if id.customlink then -- use function to validate and generate link
		local newlink = require(config.auxiliary)[id.customlink](val.id, additional)
		if newlink then
			link:wikitext(newlink)
			valid_value = true
		end
	else
		if id.pattern then -- check pattern to determine validity
			valid_value = string.match(val.id, '^' .. id.pattern .. '$')
		elseif id.patterns then -- check multiple patterns to determine validity
			for _, pattern in ipairs(id.patterns) do
				valid_value = val.id:match('^' .. pattern .. '$')
				if valid_value then break end
			end
		elseif id.valid then -- use function to determine validity
			valid_value = require(config.auxiliary)[id.valid](val.id)
		else -- no validation possible
			valid_value = val.id
		end
		if valid_value then
			local label = id.label
			if not label or additional then
				label = tostring(additional)
			end
			local newlink
			if id.link then
				valid_value = valid_value:gsub('%%', '%%%%')
				local target = mw.ustring.gsub(id.link, '%$1', valid_value):gsub(' ', '%%20')
				newlink = '[' .. target .. ' ' .. label .. ']'
			else
				newlink = valid_value
			end
			link:wikitext(tooltip(newlink, val.name))
		end
	end
	if valid_value then
		local cat =  id.category and string.format(config.i18n.cat, id.category)
		link:wikitext(addCat(cat))
	else
		local wdlink = qid and wikilink(':wikidata:' .. qid .. '#P' .. id.property) or ''
		local name = mw.wikibase.getLabel('P' .. id.property) or ''
		local tooltip = string.format(
			config.i18n.idnotvalid,
			name,
			val.id
		)
		local cat = id.category and string.format(
			config.i18n.cat,
			config.i18n.faulty .. ' ' .. id.category
		)
		link:wikitext(wikilink('File:' .. config.i18n.warningicon .. '|20px|frameless|link=' .. wdlink, tooltip .. '.'))
			:wikitext(addCat(cat))
			:wikitext(addCat(config.i18n.allfaultycat, name))
	end
	return link
end

local _makelinks = function(id, qid)
--[[==================================]]
--[[            Make links            ]]
--[[==================================]]
local getquals = function(statement, qualid)
	if statement.qualifiers and statement.qualifiers['P'..qualid] then
		return mw.wikibase.renderSnak(statement.qualifiers['P'..qualid][1])
	end
end
local ids = {}
if qid then
	for _, statement in ipairs(mw.wikibase.getBestStatements(qid, 'P'..id.property)) do
		if statement.mainsnak.datavalue then
			local val = statement.mainsnak.datavalue.value
			if val then
				local namedas = getquals(statement, 1810) or getquals(statement, 742) or ''
				table.insert(ids, {id=val, name=namedas})
end end end end
local links
if ids[1] then
	links = mw.html.create('li'):node(_makelink(id, ids[1], false, qid))
	if ids[2] then
		local sublinks = mw.html.create('ul')
		for n = 2, #ids do
			sublinks:tag('li'):node(_makelink(id, ids[n], n, qid)):done()
		end
		links:node(sublinks)
	end
end
return links
end

p.authorityControl = function(frame)
--[[==================================]]
--[[               Main               ]]
--[[==================================]]
local args = getArgs(frame, {parentOnly = true})
local resolveQID = function(qid)
	if qid then
		qid = 'Q' .. mw.ustring.gsub(qid, '^[Qq]', '')
		if mw.wikibase.isValidEntityId(qid) and mw.wikibase.entityExists(qid) then
			local sitelink = mw.wikibase.getSitelink(qid)
			if sitelink then
				return mw.wikibase.getEntityIdForTitle(sitelink) or mw.wikibase.getEntity(qid).id
			end
			return mw.wikibase.getEntity(qid).id
end end end
local conf = config.config
local auxCats = ''
local rct = false -- boolean to track if there are any links to be returned
local qid, topic
if namespace==0 then
	qid = mw.wikibase.getEntityIdForCurrentPage()
end
if qid then -- article is connected to a Wikidata item
	if args.qid and resolveQID(args.qid)~=qid then -- non-matching qid parameter
		auxCats = auxCats .. needsAttention('D')
	end
else -- page is not connected to any Wikidata item
	qid = resolveQID(args.qid) -- check qid parameter if no wikidata item is connected
	if qid then -- qid parameter is valid, set topic to display
		topic = mw.wikibase.getLabel(qid)
		if topic then
			if mw.ustring.lower(title.subpageText)==mw.ustring.lower(topic) then -- suppress topic display if subpagename equals topic up to case change
				topic = nil
			end
			if topic and mw.wikibase.getSitelink(qid) then -- make wikilink to article
				topic = wikilink(mw.wikibase.getSitelink(qid), topic)
			end
		else
			auxCats = auxCats .. needsAttention('L')
		end
	elseif args.qid then -- invalid qid has been supplied, add to tracking cat
		auxCats = auxCats .. needsAttention('Q')
	end
end
local qids = {} -- setup any additional QIDs
if args.additional=='auto' then
	if qid then  -- check P527 for parts to add additional qids
		local checkparts = function(property)
			local parts = mw.wikibase.getBestStatements(qid, property)
			if parts then
				for _, part in ipairs(parts) do
					if part.mainsnak.datavalue and part.mainsnak.datavalue.value.id then
						local resolvedqid = resolveQID(part.mainsnak.datavalue.value.id)
						if resolvedqid then
							table.insert(qids,resolvedqid)
		end end end end end
		for _, part in ipairs(config.auto_additional) do
			checkparts('P' .. part)
		end
	end
elseif args.additional then
	for _, v in ipairs(mw.text.split(args.additional, '%s*,%s*')) do
		v = resolveQID(v)
		if v then
			if v==qid then -- duplicate of qid parameter
				auxCats = auxCats .. needsAttention('R')
			end
			table.insert(qids, v)
		else -- invalid QID specified
			auxCats = auxCats .. needsAttention('A')
		end
	end
end
local numsections, sections = 0, {}
for _, _ in ipairs(config.sections) do -- count number of regular sections
	numsections = numsections + 1
end
for _ = 1, #qids+numsections do
	table.insert(sections, {})
end

-- check which identifiers to show/suppress in template
local show, show_all_unsuppressed = {}, true
local stripP = function(pid) --strip P from property number
	if pid:match('^[Pp]%d+$') then
		pid = mw.ustring.gsub(pid, '[Pp]', '')
	end
	pid = tonumber(pid)
	if pid and mw.wikibase.entityExists('P' .. pid) then
		return pid
	end
end
local addshowlist = function(list)
	if list then
		for _, v in ipairs(mw.text.split(string.lower(list), '%s*,%s*')) do
			if config.whitelists[v] then -- e.g. show=arts to use whitelist
				for _, w in ipairs(config.whitelists[v].properties) do
					show[w] = true
				end
			else
				v = stripP(v)
				if v then -- e.g. show=P214 to show one particular property
					show[v] = true
				else -- unrecognised property or whitelist
					auxCats = auxCats .. needsAttention('W')
				end
			end
		end
		show_all_unsuppressed = false
	end
end
addshowlist(frame.args.show) -- check show parameter on wrapper template
addshowlist(args.show) -- check show parameter on article
addshowlist(args.country) -- check country parameter on article
if args.suppress then
	local suppresslist = mw.text.split(args.suppress, '%s*,%s*') -- split parameter by comma
	for _, v in ipairs(suppresslist) do
		v = stripP(v)
		if v then
			show[v] = false
			auxCats = auxCats .. wikilink(config.i18n.category .. ':' .. config.i18n.suppressedcat)
		else
			auxCats = auxCats .. needsAttention('P')
		end
	end
end

local makeSections = function(qid, addit)
	for _, id in ipairs(conf) do
		if id.suppressedbyproperty then
			for _, property in ipairs(id.suppressedbyproperty) do
				if show[property]=='used' then -- property is in use
					show[id.property] = false -- suppressed by another property
		end end end
		if show[id.property]==nil then
			show[id.property] = show_all_unsuppressed
		end
		if show[id.property] then
			local links = _makelinks(id, qid)
			if links then
				table.insert(
					sections[addit or id.section],
					links
				)
				show[id.property] = 'used'
				rct = true
			end
		end
	end
end
local pencil = function(qid)
	if qid then
		return require('Module:EditAtWikidata')._showMessage{
			pid = 'identifiers',
			qid = qid
		}
	else
		return ''
	end
end
makeSections(qid, false)
for c = 1, #qids do
	makeSections(qids[c], numsections+c)
end

--configure Navbox
local outString = ''
if rct then -- there is at least one link to display
	local Navbox = require('Module:Navbox')
	local sect, lastsect = 0, 0
	local navboxArgs = {
		name  = 'Authority control',
		navboxclass = 'authority-control',
		bodyclass = 'hlist',
		state = args.state or config.i18n.autocollapse,
		navbar = 'off'
	}
	for c = 1, numsections+#qids do
		if #sections[c]>0 then -- section is non-empty
			sect = sect + 1
			lastsect = c
			local sectname
			if c<=numsections then -- regular section
				sectname = config.sections[c].name
			else -- section from additional qid
				local qid = qids[c-numsections]
				local label, sitelink = mw.wikibase.getLabel(qid), mw.wikibase.getSitelink(qid)
				if label then
					if sitelink then
						local target = mw.title.new(sitelink)
						if target==title or (target.isRedirect and target.redirectTarget==title) then -- do not link
							sectname = label
						else -- make wikilink to article
							sectname = wikilink(sitelink, label)
						end
					else
						sectname = label
					end
				else
					auxCats = auxCats .. needsAttention('L')
					sectname = qid
				end
				sectname = sectname .. pencil(qid)
			end
			navboxArgs['group' .. c] = sectname
			local list = mw.html.create('ul')
			for _, link in ipairs(sections[c]) do
				list:node(link)
			end
			navboxArgs['list' .. c] = tostring(list)
		end
	end
	if topic then -- display in expanded form with topic
		navboxArgs.title = config.i18n.aclink .. ' &ndash; ' .. topic .. pencil(qid)
	elseif sect==1 then -- special display when only one section
		if lastsect<=numsections then
			if config.sections[lastsect].hidelabelwhenalone then -- no special label when only general or other IDs are present
				navboxArgs['group' .. lastsect] = config.i18n.aclink .. pencil(qid)
			else -- other regular section
				navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect] .. pencil(qid)
			end
		else -- section from additional qid
			navboxArgs['group' .. lastsect] = config.i18n.aclink .. ': ' .. navboxArgs['group' .. lastsect]
		end
	else -- add title to navbox
		navboxArgs.title = config.i18n.aclink .. pencil(qid)
	end
	outString = Navbox._navbox(navboxArgs)
end

if args.state
	and args.state~=config.i18n.collapsed
	and args.state~=config.i18n.expanded
	and args.state~=config.i18n.autocollapse then --invalid state parameter
	auxCats = auxCats .. needsAttention('S')
end
if testcases then
	auxCats = mw.ustring.gsub(auxCats, '(%[%[)(' .. config.i18n.category .. ')', '%1:%2') --for easier checking
end

--out
outString = outString .. auxCats
if namespace~=0 then
	outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.Articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
	outString = mw.ustring.gsub(outString, '(%[%[)(' .. config.i18n.category .. ':' .. config.i18n.All_articles .. ')([^%|%]]+)%|?[^%|%]]*(%]%])','%1:%2%3%4')
end
local check = require('Module:Check for unknown parameters')._check
local sortkey
if namespace==0 then
	sortkey = '*' .. title.text
else
	sortkey = title.fullText
end
outString = outString .. check({
	['unknown'] = wikilink(config.i18n.category .. ':' .. config.i18n.pageswithparams, sortkey),
	['preview'] = config.i18n.previewwarning, 'show', 'country', 'suppress', 'additional', 'qid', 'state'
	}, args)
return outString
end

p.makelink = function(id, qid)
	return _makelinks(id, qid)
end

return p