Module:CitesFormula: Difference between revisions
From MaRDI portal
EloiFerrer (talk | contribs) Created page with "-- 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 function replaceItemWithFormulaLink(dataTable) -- Check if the data table is valid if not dataTable or type(dataTable) ~= 'table' then return nil, "Invalid data table" end..." |
EloiFerrer (talk | contribs) No edit summary |
||
Line 8: | Line 8: | ||
-- Main table to hold all functions | -- Main table to hold all functions | ||
local p = {} | local p = {} | ||
-- Function to build a HTML table from SPARQL query results | -- Function to build a HTML table from SPARQL query results | ||
function p.buildTableFromSparql(frame) | function p.buildTableFromSparql(frame) | ||
-- Retrieve | -- Retrieve target from frame arguments or return error message if not set | ||
local target = frame.args[1] | local target = frame.args[1] | ||
if not target or target == '' then | if not target or target == '' then | ||
return "No records found" | return "No records found" | ||
end | 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 | |||
-- Constructing the SPARQL query with dynamic entity target | |||
local sparqlQuery = [[ | local sparqlQuery = [[ | ||
PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target .. [[> | PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target .. [[> | ||
SELECT ? | SELECT | ||
?publication_date ?work ?workLabel | |||
?workUrl | |||
(REPLACE(STR(?work), "^.*/", "") AS ?qid) | |||
?item_type | |||
?item_type_label | |||
WHERE { | WHERE { | ||
?work wdt:P1456 target: . | |||
? | VALUES ?allowedValues { wd:Q5976449 wd:Q5976450 wd:Q5984635 } | ||
OPTIONAL { | ?work wdt:P1460 ?allowedValues. | ||
OPTIONAL { | |||
} | ?work wdt:P28 ?publication_datetime . | ||
} | |||
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 | -- Executing the SPARQL query and retrieving results in JSON format | ||
local jsonResults = sparql.runQuery(sparqlQuery) | local jsonResults = sparql.runQuery(sparqlQuery) | ||
-- Handle error in SPARQL query execution | -- Handle error in SPARQL query execution | ||
if jsonResults and jsonResults.error then | if jsonResults and jsonResults.error then | ||
Line 61: | Line 77: | ||
return nil | return nil | ||
end | end | ||
if not jsonResults then | if not jsonResults then | ||
return "Could not fetch data." | return "Could not fetch data." | ||
Line 70: | Line 86: | ||
end | 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 | -- Convert the JSON results into a Lua table | ||
local dataTable = helper. | local fieldOrder = {"workUrl", "workLabel", "work", "publication_date", "qid", "item_type", "item_type_label"} | ||
dataTable = | local dataTable = helper.convertJsonToTableOrdered(jsonResults, fieldOrder) | ||
-- Create and return HTML table from the data | |||
local headers = {"Publication", "Date of Publication", "Type"} | |||
local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}, {6, 7}}) | |||
-- 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) | |||
return tostring(parentContainer) | |||
end | end | ||
-- Return the created html table | -- Return the created html table | ||
return p | return p |
Revision as of 09:09, 21 June 2024
Documentation for this module may be created at Module:CitesFormula/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 = {}
-- Function to build a HTML table from SPARQL query results
function p.buildTableFromSparql(frame)
-- Retrieve target from frame arguments or return error message if not set
local target = frame.args[1]
if not target or target == '' 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 target
local sparqlQuery = [[
PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target .. [[>
SELECT
?publication_date ?work ?workLabel
?workUrl
(REPLACE(STR(?work), "^.*/", "") AS ?qid)
?item_type
?item_type_label
WHERE {
?work wdt:P1456 target: .
VALUES ?allowedValues { wd:Q5976449 wd:Q5976450 wd:Q5984635 }
?work wdt:P1460 ?allowedValues.
OPTIONAL {
?work wdt:P28 ?publication_datetime .
}
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
local jsonResults = sparql.runQuery(sparqlQuery)
-- 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", "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", "Type"}
local htmlTable = helper.createHtmlTableWithMergedCols(dataTable, headers, {{1, 2}, {4}, {6, 7}})
-- 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)
return tostring(parentContainer)
end
-- Return the created html table
return p