Module:P703
Description
This module displays organisms from Wikidata property P703 ("found in taxon") with inline citations extracted directly from Wikidata references. It is completely self-contained with zero external module dependencies, making it easily transferable across all Wikimedia projects.
Key Features
- Zero dependencies: No reliance on language-specific citation or Wikidata modules
- Inline citations: Automatically extracts and formats bibliographic data from Wikidata
- Smart interwiki linking: Links to local articles, fallback to other languages, or Wikidata
- Highly configurable: Customizable display count and citation behavior
- Internationalization ready: Easy to translate via i18n table
Usage
Basic Syntax
{{#invoke:P703|main}}
With Custom Parameters
{{#invoke:P703|main|qid=Q3613679|numval=10|sources=true}}
In Infoboxes
|organisms={{#if: {{#property:P703}} | {{#invoke:P703|main}} | }}
Parameters
| Parameter | Description | Default Value | Valid Values |
|---|---|---|---|
qid |
Wikidata entity ID to query | Current page's QID | Any valid Q-identifier (e.g., Q3613679)
|
numval |
Maximum organisms to display | 5 |
Any positive integer |
sources |
Display inline citations | true |
true, false, yes, no
|
Behavior
The module adapts its output based on the number of organisms found:
| Scenario | Output Format | Example |
|---|---|---|
| No organisms | Returns localized "no known organism" message | no known organism
|
| 1–n organisms | Shows count and complete list | 3 organisms: Human, Mouse, Rat
|
| More than n organisms | Shows count with "including" prefix | 15 organisms, including: Human, Mouse, Rat, Dog, Cat
|
Examples
Example 1: Standard Use (Current Page)
{{#invoke:P703|main}}
Output: 2 organisms: Human, Mouse
Example 2: Specific Entity
{{#invoke:P703|main|qid=Q3613679}}
Output: Displays organisms for Wikidata item Q3613679
Example 3: Display 20 Organisms
{{#invoke:P703|main|numval=20}}
Output: 25 organisms, including: [first 20 organisms]
Example 4: Without Citations
{{#invoke:P703|main|sources=false}}
Output: 5 organisms: Human, Mouse, Rat, Dog, Cat (no reference tags)
Example 5: Combine All Parameters
{{#invoke:P703|main|qid=Q2079986|numval=3|sources=true}}
Output: 10 organisms, including: Organism₁[1], Organism₂[2], Organism₃[3]
Citation Format
When sources=true (default), the module automatically extracts and formats bibliographic data from Wikidata references:
Supported Fields:
- Authors (up to 3, then "et al.")
- Article title (with optional URL)
- Journal name (italicized)
- Volume (bold) and issue number
- Page numbers
- Publication year
- DOI and PMID identifiers
Example Citation:
Smith J, Jones A, Williams B et al. "Protein Expression in Model Organisms". Nature Genetics 45 (3): pp. 123-130. (2023). doi:10.1038/ng.3456. pmid:12345678.
Interwiki Linking Logic
The module intelligently chooses the best link for each organism:
- Local wiki article exists →
[[Local Article|Label]] - Article exists on another wiki →
Label (lang) - No article found →
Label (d)
This ensures users can always access information about the organism, even if no local article exists.
Internationalization
To adapt this module for other languages, edit the i18n table in the code:
local i18n = {
no_organism = "aucun organisme connu", -- French example
including = "dont",
wd_label = "d",
separator = ", ",
organism = "organisme",
organisms = "organismes"
}
Technical Details
Performance Optimizations
- Entity caching: Prevents redundant API calls for referenced sources
- Lazy evaluation: Only fetches data when needed
- Efficient claim processing: Stops at
numvallimit
Zero Dependencies
Unlike most modules, P703 is completely self-contained:
No Module:LanguageSpecificModule
Direct Wikibase API usage only
This makes it:
- Easy to deploy on any Wikimedia project
- Maintainable without external module updates
- Consistent across different language wikis
Error Handling
| Scenario | Module Response |
|---|---|
| No QID provided | Uses current page's Wikidata item |
| Invalid QID | Returns "no known organism" |
| No P703 claims | Returns "no known organism" |
| Missing reference data | Gracefully omits citation |
| Malformed citation data | Includes available fields only |
See Also
- Wikidata Property P703 - "found in taxon"
- Wikidata Data Access
- Wikibase Client Lua API
License
This module is released under CC0 (Public Domain). Feel free to adapt, translate, and deploy on any Wikimedia project without attribution.
--[[
╔════════════════════════════════════════════════════════════════════════════╗
║ Module:P703 - Organism Display with Inline Citations ║
║ ║
║ Author: AdrianoRutz ║
║ License: CC0 / Public Domain ║
║ ║
║ Description: ║
║ Displays organisms (P703 "found in taxon") with formatted citations ║
║ extracted directly from Wikidata references. Zero external dependencies. ║
║ ║
║ Usage: ║
║ {{#invoke:P703|main|qid=Q2079986|numval=5|sources=true}} ║
║ ║
║ Parameters: ║
║ - qid: Wikidata entity ID (defaults to current page) ║
║ - numval: Maximum organisms to display (default: 5) ║
║ - sources: Show inline citations (default: true) ║
╚════════════════════════════════════════════════════════════════════════════╝
--]]
local p = {}
--[[────────────────────────────────────────────────────────────────────────────
SECTION 1: CONFIGURATION & INTERNATIONALIZATION
────────────────────────────────────────────────────────────────────────────]]
-- Localization strings - edit these for language-specific deployments
local i18n = {
no_organism = "no known organism",
including = "including",
wd_label = "d", -- Label for Wikidata link
separator = ", ", -- List separator
organism = "organism", -- Singular form
organisms = "organisms" -- Plural form
}
-- Entity cache prevents redundant API calls for the same Wikidata item
local entityCache = {}
--[[────────────────────────────────────────────────────────────────────────────
SECTION 2: CITATION ENGINE
Extracts and formats bibliographic data from Wikidata references.
Supports: authors, title, journal, volume, issue, pages, DOI, PMID, dates
────────────────────────────────────────────────────────────────────────────]]
--- Safely extracts a property value from a Wikidata entity
-- @param entity table The Wikidata entity object
-- @param prop string The property ID (e.g., "P1476")
-- @return string|nil The property value or nil if not found
local function getPropertyValue(entity, prop)
local claims = entity.claims and entity.claims[prop]
if not claims or not claims[1].mainsnak.datavalue then
return nil
end
local datavalue = claims[1].mainsnak.datavalue.value
-- Handle different datavalue types
if type(datavalue) == "table" then
return datavalue.text or datavalue.id or datavalue.time
end
return datavalue
end
--- Extracts and formats author list from Wikidata
-- @param entity table The source entity containing author claims
-- @param maxAuthors number Maximum authors to list before "et al."
-- @return string|nil Formatted author string or nil
local function getAuthors(entity, maxAuthors)
maxAuthors = maxAuthors or 3
local authorClaims = entity.claims and (entity.claims.P50 or entity.claims.P2093)
if not authorClaims then
return nil
end
local authors = {}
for i, snak in ipairs(authorClaims) do
if i > maxAuthors then
table.insert(authors, "et al.")
break
end
if snak.mainsnak.datavalue then
local authorValue = snak.mainsnak.datavalue.value
local authorId = (type(authorValue) == "table") and authorValue.id or authorValue
table.insert(authors, mw.wikibase.getLabel(authorId) or authorId)
end
end
return #authors > 0 and table.concat(authors, ", ") or nil
end
--- Generates formatted citation from Wikidata reference
-- @param frame table MediaWiki frame object (for extensionTag)
-- @param claim table The Wikidata claim containing references
-- @return string Formatted MediaWiki reference(s) or empty string
local function getCleanRef(frame, claim)
if not claim.references then
return ""
end
local refs = {}
for _, ref in ipairs(claim.references) do
local cite = {}
local sourceQid = nil
-- Extract source (P248 = "stated in")
if ref.snaks and ref.snaks.P248 then
sourceQid = ref.snaks.P248[1].datavalue.value.id
end
if sourceQid then
-- Use cached entity if available to reduce API calls
local srcEntity = entityCache[sourceQid] or mw.wikibase.getEntity(sourceQid)
if srcEntity then
entityCache[sourceQid] = srcEntity
-- Extract bibliographic metadata
cite.title = getPropertyValue(srcEntity, "P1476") or mw.wikibase.getLabel(sourceQid)
cite.journal = mw.wikibase.getLabel(getPropertyValue(srcEntity, "P1433"))
cite.vol = getPropertyValue(srcEntity, "P478")
cite.issue = getPropertyValue(srcEntity, "P433")
cite.pages = getPropertyValue(srcEntity, "P304")
cite.doi = getPropertyValue(srcEntity, "P356")
cite.pmid = getPropertyValue(srcEntity, "P698")
cite.authors = getAuthors(srcEntity, 3)
-- Extract publication year from date
local rawDate = getPropertyValue(srcEntity, "P577")
if type(rawDate) == "string" then
cite.date = rawDate:match("+?(%d%d%d%d)")
end
end
elseif ref.snaks and ref.snaks.P854 then
-- Fallback to URL reference (P854 = "reference URL")
cite.url = ref.snaks.P854[1].datavalue.value
end
-- Assemble citation in bibliographic format
local parts = {}
-- Authors
if cite.authors and cite.authors ~= "" then
table.insert(parts, cite.authors .. ".")
end
-- Title (with optional URL)
if cite.title then
local titleStr = cite.url and ("[" .. cite.url .. ' "' .. cite.title .. '"]') or ('"' .. cite.title .. '"')
table.insert(parts, titleStr .. ".")
elseif cite.url then
table.insert(parts, "[" .. cite.url .. " Wikidata Source].")
end
-- Journal information
if cite.journal then
local journalStr = "''" .. cite.journal .. "''"
if cite.vol then
journalStr = journalStr .. " '''" .. cite.vol .. "'''"
end
if cite.issue then
journalStr = journalStr .. " (" .. cite.issue .. ")"
end
if cite.pages then
journalStr = journalStr .. ": pp. " .. cite.pages
end
table.insert(parts, journalStr .. ".")
end
-- Publication date
if cite.date then
table.insert(parts, "(" .. cite.date .. ").")
end
-- Identifiers
if cite.doi then
table.insert(parts, "[[doi:" .. cite.doi .. "|doi:" .. cite.doi .. "]].")
end
if cite.pmid then
table.insert(parts, "[[pmid:" .. cite.pmid .. "|pmid:" .. cite.pmid .. "]].")
end
-- Create MediaWiki reference tag
if #parts > 0 then
table.insert(refs, frame:extensionTag("ref", table.concat(parts, " ")))
end
end
-- Using a span with vertical-align: super ensures it matches the ref marker height exactly
return table.concat(refs, '<span style="vertical-align: 0.9em; font-size: 0.7em;">,</span>')
end
--[[────────────────────────────────────────────────────────────────────────────
SECTION 3: DYNAMIC INTERWIKI LINKING
Creates smart links that:
1. Link to local wiki article if it exists
2. Link to another language wiki with lang code if no local article
3. Link to Wikidata as fallback
────────────────────────────────────────────────────────────────────────────]]
--- Generates optimal interwiki link for a Wikidata item
-- @param itemId string The Wikidata Q-identifier
-- @return string Formatted wikilink with fallback to interwiki or Wikidata
local function getDynamicLink(itemId)
local label = mw.wikibase.getLabel(itemId) or itemId
local entity = mw.wikibase.getEntity(itemId)
local sitelinks = (entity and entity.sitelinks) or {}
-- Priority 1: Local wiki article
local currentWiki = mw.language.getContentLanguage():getCode() .. "wiki"
if sitelinks[currentWiki] then
return "[[" .. sitelinks[currentWiki].title .. "|" .. label .. "]]"
end
-- Priority 2: First available interwiki link (excluding Wikidata/Commons)
for wiki, data in pairs(sitelinks) do
if wiki:match("wiki$") and wiki ~= "wikidatawiki" and wiki ~= "commonswiki" then
local langCode = wiki:gsub("wiki$", ""):gsub("_", "-")
return label .. " <small>([[:" .. langCode .. ":" .. data.title .. "|" .. langCode .. "]])</small>"
end
end
-- Priority 3: Wikidata fallback
return label .. " <small>([[:d:" .. itemId .. "|" .. i18n.wd_label .. "]])</small>"
end
--[[────────────────────────────────────────────────────────────────────────────
SECTION 4: MAIN ENTRY POINT
────────────────────────────────────────────────────────────────────────────]]
--- Main function to display organism list with citations
-- @param frame table MediaWiki frame object containing arguments
-- @return string Formatted organism list with references
function p.main(frame)
-- Handle both direct invoke and template parameter passing
local args = frame.args
if not args.qid or args.qid == "" then
args = frame:getParent().args
end
-- Extract parameters with defaults
local qid = (args.qid and args.qid ~= "") and args.qid or mw.wikibase.getEntityIdForCurrentPage()
local numval = tonumber(args.numval) or 5
local showSources = (args.sources ~= "false" and args.sources ~= "no")
-- Validate entity and P703 claims exist
local entity = mw.wikibase.getEntity(qid)
if not entity or not entity.claims or not entity.claims.P703 then
return i18n.no_organism
end
-- Process claims
local claims = entity.claims.P703
local count = #claims
local results = {}
for i = 1, math.min(count, numval) do
local claim = claims[i]
if claim.mainsnak and claim.mainsnak.datavalue then
local id = claim.mainsnak.datavalue.value.id
local link = getDynamicLink(id)
local ref = showSources and getCleanRef(frame, claim) or ""
table.insert(results, link .. ref)
end
end
-- Format output with proper pluralization
local lang = mw.getContentLanguage()
local label = lang:plural(count, i18n.organism, i18n.organisms)
local listStr = table.concat(results, i18n.separator)
if count > numval then
return count .. " " .. label .. ", " .. i18n.including .. ": " .. listStr
else
return count .. " " .. label .. ": " .. listStr
end
end
--[[────────────────────────────────────────────────────────────────────────────
SECTION 5: METATABLE FOR DIRECT INVOCATION
Allows calling the module as {{#invoke:P703|...}} or simply {{P703|...}}
────────────────────────────────────────────────────────────────────────────]]
setmetatable(
p,
{
__call = function(t, frame)
return p.main(frame)
end
}
)
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.