Module:ResearchField
From MaRDI portal
Documentation for this module may be created at Module:ResearchField/doc
-- Required modules for SPARQL queries and HTML table generation
-- Module for executing SPARQL queries
local sparql = require('SPARQL')
-- MediaWiki library for logging and utilities
local mw = require('mw')
local json = require("mw.text")
-- Main table to hold all functions
local p = {}
-- Function to get specialized Research Fields
function p.getSpecializedResearchFields(frame)
local entityId = frame.args[1]
-- Validate input parameter
if not entityId or entityId == '' then
return "Error: No entity ID provided"
end
-- Constructing the SPARQL query with dynamic entity entityId
-- P1684: specialized by property id
local sparqlQuery = [[
PREFIX entityId: <https://portal.mardi4nfdi.de/entity/]] .. entityId .. [[>
SELECT ?URL ?Label
WHERE {
entityId: wdt:P1684 ?URL.
?URL rdfs:label ?Label
}
]]
-- Executing the SPARQL query and retrieving results in JSON format
local jsonResults = sparql.runQuery(sparqlQuery)
-- Validate results
if not jsonResults or not jsonResults.results or not jsonResults.results.bindings then
return "No specialized research fields found"
end
local specializedResearchFields = {}
-- Get the number of specialized research fields
local totalSpecResFields = #jsonResults.results.bindings
-- Loop through the bindings
for index = 0, totalSpecResFields do
local item = jsonResults.results.bindings[index]
if not item.Label.value then
return "Error: Missing item.Label.value"
elseif not item.URL.value then
return "Error: Missing item.URL.value"
else
local label = item.Label.value
local url = item.URL.value
local numericId = url:match("Q(%d+)")
local urlRendered = "https://portal.mardi4nfdi.de/wiki/Research_field:" .. numericId
local labelWithUrl = string.format('[%s %s]', tostring(urlRendered), tostring(label))
table.insert(specializedResearchFields, "| " .. labelWithUrl)
end
end
-- Construct the Wikitext table
local wikitextTable = "{| class='wikitable'\n" .. table.concat(specializedResearchFields, "\n|-\n") .. "\n|}"
return wikitextTable
end
-- Function to get contained Research Problems
function p.getContainedResearchProblems(frame)
local entityId = frame.args[1]
-- Validate input parameter
if not entityId or entityId == '' then
return "Error: No entity ID provided"
end
-- Constructing the SPARQL query with dynamic entity entityId
-- P1560: contains property id
local sparqlQuery = [[
PREFIX entityId: <https://portal.mardi4nfdi.de/entity/]] .. entityId .. [[>
SELECT ?URL ?Label
WHERE {
entityId: wdt:P1560 ?URL.
?URL rdfs:label ?Label
}
]]
-- Executing the SPARQL query and retrieving results in JSON format
local jsonResults = sparql.runQuery(sparqlQuery)
-- Validate results
if not jsonResults or not jsonResults.results or not jsonResults.results.bindings then
return "No contained research problems found"
end
local containedProblems = {}
-- Get the number of specialized research fields
local totalContResProblems = #jsonResults.results.bindings
-- Loop through the bindings
for index = 0, totalContResProblems do
local item = jsonResults.results.bindings[index]
if not item.Label.value then
return "Error: Missing item.Label.value"
elseif not item.URL.value then
return "Error: Missing item.URL.value"
else
local label = item.Label.value
local url = item.URL.value
local numericId = url:match("Q(%d+)")
local urlRendered = "https://portal.mardi4nfdi.de/wiki/Research_problem:" .. numericId
local labelWithUrl = string.format('[%s %s]', tostring(urlRendered), tostring(label))
table.insert(containedProblems, "| " .. labelWithUrl)
end
end
-- Construct the Wikitext table
local wikitextTable = "{| class='wikitable'\n" .. table.concat(containedProblems, "\n|-\n") .. "\n|}"
return wikitextTable
end
function p.getImageWithLegend(frame)
-- Property ID for the image
local pidImage = "P356"
-- Property ID for the (qualifier) media legend
local pidMediaLegend = "P401"
local defaultLegend = "No legend available."
local entityId = frame.args[1]
-- Validate input parameter
if not entityId or entityId == '' then
return "Error: No entity ID provided"
end
-- Attempt to retrieve entity data
local entity = mw.wikibase.getEntity(entityId)
local imageClaims = entity.claims[pidImage]
local imageStrings = {}
if imageClaims and type(imageClaims) == "table" then
local numClaims = #imageClaims
-- Loop through the image claims
for index = 1, numClaims do
-- Extract the image filename
local imageFilename = imageClaims[index].mainsnak.datavalue.value
local imageLegend = imageClaims[index].qualifiers[pidMediaLegend][1].datavalue.value.text
-- Add this image line to the list
table.insert(imageStrings, string.format("[[File:%s|thumb|340px|%s]]", imageFilename, imageLegend))
if index < numClaims then
-- spacer column
table.insert(imageStrings, ' ')
end
end
-- Combine all image cells into one row of a wikitable
local imageTable = '{| class="wikitable"\n| ' .. table.concat(imageStrings, ' || ') .. '\n|}'
return imageTable .. "\n\n"
else
return " "
end
end
return p