Zum Inhalt springen

„Modul:WikibaseLink“ – Versionsunterschied

aus AufEinWort, der freien Forschung
Die Seite wurde neu angelegt: „local p = {} function p.itemLink(frame) local id = mw.wikibase.getEntityIdForCurrentPage() if not id then return '' end return string.format('Datenobjekt: %s', id, id) end return p“
 
KKeine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
local p = {}
local p = {}
-- Hilfsfunktion: interner Link auf eine Entität (Q/L/…)
local function entityLink(id, label)
if not id then return nil end
label = label or id
return string.format('[[Special:EntityPage/%s|%s]]', id, label)
end
-- 1) Q-Link über Sitelink (funktioniert im Content-Namensraum)
function p.itemLink(frame)
function p.itemLink(frame)
  local id = mw.wikibase.getEntityIdForCurrentPage()
local id = mw.wikibase.getEntityIdForCurrentPage()
  if not id then return '' end
if not id or id:sub(1,1) ~= 'Q' then
  return string.format('[[Special:EntityPage/%s|Datenobjekt: %s]]', id, id)
return ''
end
return entityLink(id, 'Datenobjekt: ' .. id)
end
 
-- 2) L-Link: explizit oder via Heuristik (Label=Seitentitel)
-- Nutzung: {{#invoke:WikibaseLink|lexemeLink}} oder mit Vorgabe {{#invoke:WikibaseLink|lexemeLink|L= L2}}
function p.lexemeLink(frame)
local args = frame and frame.args or {}
local lexId = args.L or args.lexeme or args[1]
 
-- A) explizit übergeben
if lexId and tostring(lexId):match('^L%d+$') then
return entityLink(lexId, 'Lexem: ' .. lexId)
end
 
-- B) heuristisch: per Suche nach dem Seitentitel (de)
local title = mw.title.getCurrentTitle().prefixedText
-- Suche
local ok, results = pcall(mw.wikibase.searchEntities, title, 'de')
if not ok or type(results) ~= 'table' then
return ''
end
 
-- Filter: nur exakte Label-Treffer und nur Lexeme (IDs beginnen mit L)
local candidates = {}
for _, r in ipairs(results) do
if type(r) == 'table' and r.id and r.id:match('^L%d+$') then
-- Exakt gleiches Label in de?
if r.display and r.display.label and r.display.label.value == title then
table.insert(candidates, r.id)
end
end
end
 
if #candidates == 1 then
return entityLink(candidates[1], 'Lexem: ' .. candidates[1])
else
-- 0 oder >1 exakte Kandidaten -> kein eindeutiger L-Link
return ''
end
end
 
-- 3) Kombi: zeig Q und L, oder „kein WikibaseLink“
-- Nutzung: {{#invoke:WikibaseLink|both}}  oder  {{#invoke:WikibaseLink|both|L=L2}}
function p.both(frame)
local q = p.itemLink(frame)
local l = p.lexemeLink(frame)
 
if (q == '' or q == nil) and (l == '' or l == nil) then
return 'kein WikibaseLink'
end
 
if q ~= '' and l ~= '' then
return q .. ' · ' .. l
elseif q ~= '' then
return q
else
return l
end
end
end
return p
return p

Version vom 28. Oktober 2025, 17:21 Uhr

Vorlagenprogrammierung Diskussionen Lua Unterseiten
Modul Deutsch

Modul: Dokumentation

Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus


local p = {}

-- Hilfsfunktion: interner Link auf eine Entität (Q/L/…)
local function entityLink(id, label)
	if not id then return nil end
	label = label or id
	return string.format('[[Special:EntityPage/%s|%s]]', id, label)
end

-- 1) Q-Link über Sitelink (funktioniert im Content-Namensraum)
function p.itemLink(frame)
	local id = mw.wikibase.getEntityIdForCurrentPage()
	if not id or id:sub(1,1) ~= 'Q' then
		return ''
	end
	return entityLink(id, 'Datenobjekt: ' .. id)
end

-- 2) L-Link: explizit oder via Heuristik (Label=Seitentitel)
-- Nutzung: {{#invoke:WikibaseLink|lexemeLink}} oder mit Vorgabe {{#invoke:WikibaseLink|lexemeLink|L= L2}}
function p.lexemeLink(frame)
	local args = frame and frame.args or {}
	local lexId = args.L or args.lexeme or args[1]

	-- A) explizit übergeben
	if lexId and tostring(lexId):match('^L%d+$') then
		return entityLink(lexId, 'Lexem: ' .. lexId)
	end

	-- B) heuristisch: per Suche nach dem Seitentitel (de)
	local title = mw.title.getCurrentTitle().prefixedText
	-- Suche
	local ok, results = pcall(mw.wikibase.searchEntities, title, 'de')
	if not ok or type(results) ~= 'table' then
		return ''
	end

	-- Filter: nur exakte Label-Treffer und nur Lexeme (IDs beginnen mit L)
	local candidates = {}
	for _, r in ipairs(results) do
		if type(r) == 'table' and r.id and r.id:match('^L%d+$') then
			-- Exakt gleiches Label in de?
			if r.display and r.display.label and r.display.label.value == title then
				table.insert(candidates, r.id)
			end
		end
	end

	if #candidates == 1 then
		return entityLink(candidates[1], 'Lexem: ' .. candidates[1])
	else
		-- 0 oder >1 exakte Kandidaten -> kein eindeutiger L-Link
		return ''
	end
end

-- 3) Kombi: zeig Q und L, oder „kein WikibaseLink“
-- Nutzung: {{#invoke:WikibaseLink|both}}  oder  {{#invoke:WikibaseLink|both|L=L2}}
function p.both(frame)
	local q = p.itemLink(frame)
	local l = p.lexemeLink(frame)

	if (q == '' or q == nil) and (l == '' or l == nil) then
		return 'kein WikibaseLink'
	end

	if q ~= '' and l ~= '' then
		return q .. ' · ' .. l
	elseif q ~= '' then
		return q
	else
		return l
	end
end

return p