Module:PublicationRecommendedItems: Difference between revisions

From MaRDI portal
User15 (talk | contribs)
Undo revision 48467473 by User15 (talk)
Tag: Undo
User15 (talk | contribs)
changed indexing through module incept
Line 2: Line 2:
local helper = require('Module:HelperMethods')
local helper = require('Module:HelperMethods')


-- Required modules for SPARQL queries and HTML table generation
-- Required modules for SPARQL queries and HTML generation
local sparql = require('SPARQL')
local sparql = require('SPARQL')
local mwHtml = require('mw.html')
local mwHtml = require('mw.html')


-- Main table to hold all functions
local p = {}
local p = {}


-- Function to convert JSON results into a comma-separated string
----------------------------------------------------------------------
function p.convertJsonToCommaSeparatedList(jsonResults, currentPublicationId)
-- Build an unordered HTML list from SPARQL JSON results
----------------------------------------------------------------------
function p.buildRecommendationList(jsonResults, currentPublicationId)
     local ul = mw.html.create('ul')
     local ul = mw.html.create('ul')


    -- Like and dislike Icons
     local likeIcon = '👍'
     local likeIcon = '👍'
     local dislikeIcon = '👎'
     local dislikeIcon = '👎'


     if jsonResults and jsonResults.results and jsonResults.results.bindings then
     if not jsonResults
         local bindings = jsonResults.results.bindings
        or not jsonResults.results
        for i = 0, #bindings do
         or not jsonResults.results.bindings
            local binding = bindings[i]
    then
            if binding and binding.valueLabel and binding.valueLabel.value then
        return tostring(ul)
                local name = binding.valueLabel.value
    end
                if string.find(name, "https://") then
                    name = helper.titleNotAvailableStr()
                end


                 local link = binding.value.value
    for _, binding in ipairs(jsonResults.results.bindings) do
                local qidCurrPub = link:match("Q%d+")  
        if binding.value and binding.value.value then
            local name = nil
 
            if binding.valueLabel and binding.valueLabel.value then
                 name = binding.valueLabel.value
            else
                name = helper.titleNotAvailableStr()
            end
 
            -- Extract Q-ID
            local link = binding.value.value
            local qidCurrPub = link:match("Q%d+")
 
            if qidCurrPub then
                -- Convert entity link to publication wiki link
                 link = link:gsub("entity/Q", "wiki/Publication:")
                 link = link:gsub("entity/Q", "wiki/Publication:")


                 local modifiedLink = link .. "?source=recommendation&referrer=" .. currentPublicationId
                 local modifiedLink =
-- Use currentPublicationId for like/dislike redirection
                    link .. "?source=recommendation&referrer=" .. currentPublicationId
        local currentPubLink = currentPublicationId:gsub("Q", "Publication:")
 
                 --local likeLink = link .. "?source=recommendation&referrer=like"
                local currentPubLink =
                --local dislikeLink = link .. "?source=recommendation&referrer=dislike"
                    currentPublicationId:gsub("Q", "Publication:")
        local likeLink = "https://portal.mardi4nfdi.de/wiki/" .. currentPubLink .. "?reaction=like&target=" .. qidCurrPub
 
        local dislikeLink = "https://portal.mardi4nfdi.de/wiki/" .. currentPubLink .. "?reaction=dislike&target=" .. qidCurrPub
                 local likeLink =
                    "https://portal.mardi4nfdi.de/wiki/"
                    .. currentPubLink
                    .. "?reaction=like&target="
                    .. qidCurrPub
 
                local dislikeLink =
                    "https://portal.mardi4nfdi.de/wiki/"
                    .. currentPubLink
                    .. "?reaction=dislike&target="
                    .. qidCurrPub


                -- Build list item using HTML
                 local li = mw.html.create('li')
                 local li = mw.html.create('li')
               
 
                local wikiLink = helper.makeWikiLink(modifiedLink, name)
                 li:wikitext('[' .. modifiedLink .. ' ' .. name .. '] ')
                 li:wikitext('[' .. modifiedLink .. ' ' .. name .. '] ')
                 li:wikitext('[' .. likeLink .. ' ' .. likeIcon .. '] ')
                 li:wikitext('[' .. likeLink .. ' ' .. likeIcon .. '] ')
Line 55: Line 74:
end
end


-- Function to build the list
----------------------------------------------------------------------
-- Entry point invoked from wikitext
----------------------------------------------------------------------
function p.getCitesWorkList(frame)
function p.getCitesWorkList(frame)
     local target1 = frame.args[1]
     -- Retrieve target1 from frame arguments or return error message if not set
 
local target1 = frame.args[1]
     if not target1 or target1 == '' then
     if not target1 or target1 == '' then
         return "No records found"
         return "No records found"
     end  
     end
   
 
    -- Constructing the SPARQL query with dynamic entity target1
     local sparqlQuery = [[
     local sparqlQuery = [[
PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target1 .. [[>
PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target1 .. [[>
Line 70: Line 89:
PREFIX wd: <https://portal.mardi4nfdi.de/entity/>
PREFIX wd: <https://portal.mardi4nfdi.de/entity/>


SELECT ?property ?propertyLabel ?value ?valueLabel
SELECT ?value ?valueLabel
WHERE {
WHERE {
     target: wdt:P1643 ?value .
     target: wdt:P1643 ?value .
     OPTIONAL {
     OPTIONAL {
         ?value rdfs:label ?valueLabel .
         ?value rdfs:label ?valueLabel .
         FILTER(LANG(?valueLabel) = "en")
         FILTER (LANG(?valueLabel) = "en")
    }
    SERVICE wikibase:label {
        bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
     }
     }
    BIND(wdt:P1643 AS ?property)
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}
}
ORDER BY ?propertyLabel
]]
]]
   
    -- mw.log( sparqlQuery )
   
-- Executing the SPARQL query and retrieving results in JSON format
local jsonResults = sparql.runQuery(sparqlQuery)
mw.logObject(jsonResults)


-- Handle error in SPARQL query execution
    local jsonResults = sparql.runQuery(sparqlQuery)
if jsonResults and jsonResults.error then
    mw.log("Error in SPARQL query: " .. tostring(jsonResults.error))
    return nil
end


if not jsonResults then
    if not jsonResults or jsonResults.error then
         return nil
         return nil
end
    end
 
if helper.countElementsInBindings(jsonResults.results.bindings) == 0 then
    if helper.countElementsInBindings(jsonResults.results.bindings) == 0 then
         return nil
         return nil
end
    end
 
    local rawList =
        p.buildRecommendationList(jsonResults, target1)


local rawList = p.convertJsonToCommaSeparatedList(jsonResults, target1)
    local linkList =
local linkList = mw.getCurrentFrame():preprocess(rawList)
        mw.getCurrentFrame():preprocess(rawList)
-- mw.log(linkList)  


local result = [[
    local result = [[
<div class="keywords-header">
<div class="keywords-header">
<span class="keywords-title">Recommendations</span>
  <span class="keywords-title">Recommendations</span>
<div class="keywords-line"></div>
  <div class="keywords-line"></div>
</div>
<div class="keywords-list">
]] .. linkList .. [[
</div>
</div>
<div class="keywords-list"> ]] .. linkList .. [[</div>
]]
]]


     return result
     return result
end
end


-- Return the created html table
return p
return p

Revision as of 23:14, 4 January 2026

Documentation for this module may be created at Module:PublicationRecommendedItems/doc

-- Required module containing helper methods
local helper = require('Module:HelperMethods')

-- Required modules for SPARQL queries and HTML generation
local sparql = require('SPARQL')
local mwHtml = require('mw.html')

local p = {}

----------------------------------------------------------------------
-- Build an unordered HTML list from SPARQL JSON results
----------------------------------------------------------------------
function p.buildRecommendationList(jsonResults, currentPublicationId)
    local ul = mw.html.create('ul')

    local likeIcon = '👍'
    local dislikeIcon = '👎'

    if not jsonResults
        or not jsonResults.results
        or not jsonResults.results.bindings
    then
        return tostring(ul)
    end

    for _, binding in ipairs(jsonResults.results.bindings) do
        if binding.value and binding.value.value then
            local name = nil

            if binding.valueLabel and binding.valueLabel.value then
                name = binding.valueLabel.value
            else
                name = helper.titleNotAvailableStr()
            end

            -- Extract Q-ID
            local link = binding.value.value
            local qidCurrPub = link:match("Q%d+")

            if qidCurrPub then
                -- Convert entity link to publication wiki link
                link = link:gsub("entity/Q", "wiki/Publication:")

                local modifiedLink =
                    link .. "?source=recommendation&referrer=" .. currentPublicationId

                local currentPubLink =
                    currentPublicationId:gsub("Q", "Publication:")

                local likeLink =
                    "https://portal.mardi4nfdi.de/wiki/"
                    .. currentPubLink
                    .. "?reaction=like&target="
                    .. qidCurrPub

                local dislikeLink =
                    "https://portal.mardi4nfdi.de/wiki/"
                    .. currentPubLink
                    .. "?reaction=dislike&target="
                    .. qidCurrPub

                local li = mw.html.create('li')

                li:wikitext('[' .. modifiedLink .. ' ' .. name .. '] ')
                li:wikitext('[' .. likeLink .. ' ' .. likeIcon .. '] ')
                li:wikitext('[' .. dislikeLink .. ' ' .. dislikeIcon .. ']')

                ul:node(li)
            end
        end
    end

    return tostring(ul)
end

----------------------------------------------------------------------
-- Entry point invoked from wikitext
----------------------------------------------------------------------
function p.getCitesWorkList(frame)
    local target1 = frame.args[1]

    if not target1 or target1 == '' then
        return "No records found"
    end

    local sparqlQuery = [[
PREFIX target: <https://portal.mardi4nfdi.de/entity/]] .. target1 .. [[>
PREFIX wdt: <https://portal.mardi4nfdi.de/prop/direct/>
PREFIX wd: <https://portal.mardi4nfdi.de/entity/>

SELECT ?value ?valueLabel
WHERE {
    target: wdt:P1643 ?value .
    OPTIONAL {
        ?value rdfs:label ?valueLabel .
        FILTER (LANG(?valueLabel) = "en")
    }
    SERVICE wikibase:label {
        bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
    }
}
]]

    local jsonResults = sparql.runQuery(sparqlQuery)

    if not jsonResults or jsonResults.error then
        return nil
    end

    if helper.countElementsInBindings(jsonResults.results.bindings) == 0 then
        return nil
    end

    local rawList =
        p.buildRecommendationList(jsonResults, target1)

    local linkList =
        mw.getCurrentFrame():preprocess(rawList)

    local result = [[
<div class="keywords-header">
  <span class="keywords-title">Recommendations</span>
  <div class="keywords-line"></div>
</div>
<div class="keywords-list">
]] .. linkList .. [[
</div>
]]

    return result
end

return p