„Modul:WikibaseLink“ – Versionsunterschied
Erscheinungsbild
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() | |||
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 | 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