Module:CommunityResearchOutcomesList
From MaRDI portal
Documentation for this module may be created at Module:CommunityResearchOutcomesList/doc
-- Required module containing helper methods
local helper = require('Module:HelperMethods')
-- Required modules for SPARQL queries and HTML table generation
local sparql = require('SPARQL')
local mwHtml = require('mw.html')
-- Main table to hold all functions
local p = {}
local javascriptSortingCode = [[
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', function () {
var getCellValue = function (tr, idx) { return tr.children[idx].innerText || tr.children[idx].textContent; };
var comparer = function (idx, asc) {
return function (a, b) {
return function (v1, v2) {
return v1 !== '' && v2 !== '' && !isNaN(v1) && !isNaN(v2) ? v1 - v2 : v1.toString().localeCompare(v2);
}(getCellValue(asc ? a : b, idx), getCellValue(asc ? b : a, idx));
};
};
// Make sure the ID below matches with your table's ID
var table = document.querySelector('table.sortable');
if (table) {
document.querySelectorAll('th').forEach(function(th) {
th.addEventListener('click', function() {
var table = th.closest('table');
Array.from(table.querySelectorAll('tr:nth-child(n+2)'))
.sort(comparer(Array.from(th.parentNode.children).indexOf(th), this.asc = !this.asc))
.forEach(function(tr) { table.appendChild(tr); });
});
});
}
});
</script>
]]
-- Function to build a HTML table from SPARQL query results
function p.buildTableFromSparql(frame)
-- Retrieve target1 from frame arguments or return error message if not set
local target1 = frame.args[1]
if not target1 or target1 == '' then
return "No records found"
end
local height = frame.args[2] or '400px' -- Default height if not specified
local width = frame.args[3] or '800px' -- Default width if not specified
-- Get the current URL
local baseUrl = mw.site.server
-- Constructing the SPARQL query with dynamic entity target1
local sparqlQuery = [[
PREFIX target1: <https://portal.mardi4nfdi.de/entity/]] .. target1 .. [[>
PREFIX wdt: <https://portal.mardi4nfdi.de/prop/direct/>
PREFIX wd: <https://portal.mardi4nfdi.de/entity/>
SELECT
?publication_date ?work ?workLabel
?workUrl
(REPLACE(STR(?work), "^.*/", "") AS ?qid)
?item_type
?item_type_label
?internal_project_id
WHERE {
?work wdt:P1495 target1: .
VALUES ?allowedValues { wd:Q5976449 wd:Q5976450 wd:Q5984635 }
?work wdt:P1460 ?allowedValues.
OPTIONAL {
?work wdt:P28 ?publication_datetime .
}
OPTIONAL {
?work wdt:P1496 ?internal_project_id .
}
OPTIONAL {
?work wdt:P170 ?last_updated .
}
BIND(COALESCE(xsd:date(?publication_datetime), xsd:date(?last_updated), "N/A") AS ?publication_date)
OPTIONAL {
?work wdt:P1460 ?item_type .
BIND(REPLACE(STR(?item_type), "^.*/(Q[0-9]+)$", "$1") AS ?item_type_short)
BIND(IF(?item_type_short = "Q5976449", "Paper",
IF(?item_type_short = "Q5984635", "Dataset",
IF(?item_type_short = "Q5976450", "Software", "Other"))) AS ?item_type_label)
BIND(CONCAT(
IF(?item_type_short = "Q5976449", "]] .. baseUrl .. [[/wiki/Publication:",
IF(?item_type_short = "Q5984635", "]] .. baseUrl .. [[/wiki/Dataset:",
IF(?item_type_short = "Q5976450", "]] .. baseUrl .. [[/wiki/Software:", "]] .. baseUrl .. [[/wiki/"))),
REPLACE(STR(?work), "^.*/Q", "")
) AS ?workUrl)
}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
ORDER BY DESC(?publication_date)
]]
-- Executing the SPARQL query and retrieving results in JSON format
-- mw.log( sparqlQuery )
local jsonResults = sparql.runQuery(sparqlQuery)
-- mw.logObject(jsonResults)
-- Handle error in SPARQL query execution
if jsonResults and jsonResults.error then
mw.log("Error in SPARQL query: " .. tostring(jsonResults.error))
return nil
end
if not jsonResults then
return "Could not fetch data."
end
if helper.countElementsInBindings(jsonResults.results.bindings) == 0 then
return "No records found."
end
-- Extracting headers from the SPARQL query results
-- local headers = {}
-- if jsonResults and jsonResults.head and jsonResults.head.vars then
-- headers = jsonResults.head.vars
-- end
-- Convert the JSON results into a Lua table
local fieldOrder = {"workUrl", "workLabel", "work", "publication_date", "qid", "internal_project_id", "item_type", "item_type_label"}
local dataTable = helper.convertJsonToTableOrdered(jsonResults, fieldOrder)
-- Create and return HTML table from the data
local headers = {"Publication", "Date of Publication", "Project", "Type"}
local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}, {6}, {7, 8}})
-- Generate histogram data
local histogramChart = helper.generateHistogramChartFromTable(dataTable, 4)
local histogramChartJson = mw.text.jsonEncode(histogramChart)
-- mw.log(histogramDataJson)
-- Create a parent container for both the table and the chart
local parentContainer = mw.html.create('div')
:addClass('parent-container')
:css('width', width) -- Set the width as needed
-- Create chart container
local chartContainer = mw.html.create('div')
:addClass('wikiChartContainer')
:css('height', height)
:css('width', width)
:attr('data-chartdata', histogramChartJson)
local heading = mw.html.create('h2')
:wikitext('Research outcomes over time')
-- Add the table and chart to the parent container
parentContainer
:node(htmlTable)
:node(heading)
:node(chartContainer)
:node(javascriptSortingCode)
return tostring(parentContainer)
end
-- Return the created html table
return p