Module:GetData
From Bodhicitta
Documentation for this module may be created at Module:GetData/doc
local p = {}
function p.remoteGet(frame)
local prop = frame:getParent().args[1]
local source = frame.args.source
local extQuery = mw.uri.encode( "[[" .. mw.title.getCurrentTitle().subpageText .. "]]|?" .. prop .. "#|limit=1|valuesep=;|sep=;" )
local remoteContent, rcErrors = mw.ext.externalData.getExternalData("https://" .. source .. ".tsadra.org/api.php?action=ask&query=" .. extQuery .. "&format=json&api_version=3")
local json = not rcErrors and remoteContent.__json or false
-- if #json then
-- for _, result in ipairs(json.query.results) do
-- for name, values in pairs (result) do
-- for prop, value in pairs (values.printouts) do
-- return value
-- end
-- end
-- end
-- else
-- return 'No data! ¯\\_(ツ)_/¯'
-- end
end
function p.remoteSet(frame)
local pargs = frame:getParent().args
local properties = ''
for value in string.gmatch(pargs.props, "([^;]+)") do
properties = properties .. "|?" .. value .. "#"
end
local extQuery = mw.uri.encode( "[[" .. mw.title.getCurrentTitle().subpageText .. "]]" .. properties .. "|limit=10000|valuesep=;|sep=;" )
-- local testQuery = "https://" .. pargs.source .. ".tsadra.org/api.php?action=ask&query=" .. extQuery .. "&format=json&api_version=3"
-- if testQuery then
-- return testQuery
-- end
local remoteContent, rcErrors = mw.ext.externalData.getExternalData("https://" .. pargs.source .. ".tsadra.org/api.php?action=ask&query=" .. extQuery .. "&format=json&api_version=3")
local json = not rcErrors and remoteContent.__json or false
-- EXAMPLE: https://commons.tsadra.org/api.php?action=ask&query=%5B%5BRhoton%2C+J.%5D%5D%7C%3FFirstImage%7C%3FMainNamePhon%7Climit%3D10000&format=json&api_version=3
local dataStore = {}
if #json then
for _, result in ipairs(json.query.results) do
for name, values in pairs (result) do
for prop, value in pairs (values.printouts) do
local dataOutput = value
if type( value ) == 'table' then
dataOutput = mw.text.listToText( value, '; ')
end
table.insert(dataStore, prop .. '=' .. dataOutput)
if pargs.sep then
table.insert(dataStore, '+sep=' .. pargs.sep)
end
end
end
end
end
local dataStored = mw.smw.set( dataStore )
if dataStored == true then
return ''
else
return 'An error occurred during the storage process. Message reads ' .. dataStored.error
end
end
function p.set(frame)
if not mw.smw then
return "mw.smw module not found"
end
local pSetData = mw.loadData('Module:GetData/'..frame.args['data'])
local parentArgs = frame:getParent().args
local props = ''
if parentArgs.props then
props = parentArgs.props
else
props = parentArgs.prop
end
local dataStore = {}
for propValue in string.gmatch(props, "([^;]+)") do
if propValue and pSetData[propValue] then
table.insert(dataStore, propValue .. '=' .. pSetData[propValue])
if parentArgs.sep then
table.insert(dataStore, '+sep=' .. parentArgs.sep)
end
end
end
local dataStored = mw.smw.set( dataStore )
if dataStored == true then
return ''
else
return 'An error occurred during the storage process. Message reads ' .. dataStored.error
end
end
function p.main(frame)
-- bringing in property values from the appropriate set for this item
local pData = mw.loadData('Module:GetData/'..frame.args['data'])
-- bringing in the arguments passed to the parent templates
local parentArgs = frame:getParent().args
-- bringing in the properties being requested and feeding into a table
local props = parentArgs.prop
local propTable = {}
for propValue in string.gmatch(props, "([^;]+)") do
table.insert(propTable, propValue)
end
-- checking if a single property called actually has a value, if not return nothing
if #propTable == 1 then
local valueCheck = propTable[1]
if pData[valueCheck] == '' or pData[valueCheck] == nil then
if parentArgs.default then
return parentArgs.default
else
return ''
end
end
end
-- defining our output variable
local finalString = ""
-- if an intro string has been defined, adding to output string now
if parentArgs.intro then
for k,v in ipairs(propTable) do
if pData[v] ~= "" then
finalString = parentArgs.intro
end
end
end
-- iterating through requested properties
for i,prop in pairs(propTable) do
if pData[prop] then
-- feeding property value into a variable
local pdString = pData[prop]
-- checing if a "map" parameter has been defined
if parentArgs.map then
local pdTable = {}
-- checking if a sep parameter has been defined and splitting values accordingly
if parentArgs.sep then
local sep = parentArgs.sep
for value in string.gmatch(pdString, "([^" .. sep .. "]+)") do
table.insert(pdTable, value)
end
else
table.insert(pdTable, pdString)
end
-- mapping each value from above
local map = parentArgs.map
pdString = ""
for k,v in pairs(pdTable) do
if v then
mapdVal = string.gsub(map, "@@@", v)
pdString = pdString .. mapdVal
end
end
end
-- checking if a printsep parameter has been defined and separating each mapped value accordingly
if parentArgs.printsep then
finalString = finalString .. parentArgs.printsep .. frame:preprocess( pdString )
if mw.ustring.sub(finalString, 1, 1) == parentArgs.printsep then
finalString = mw.ustring.sub(finalString, 2)
end
else
finalString = finalString .. frame:preprocess( pdString )
end
end
end
-- if an outro string has been defined, adding to output string now
if parentArgs.outro then
for k,v in ipairs(propTable) do
if pData[v] ~= "" then
finalString = finalString .. parentArgs.outro
end
end
end
-- checking if a silent flag has been added, if so and string is empty anyways, return string, otherwise, check for default parent argument and return that.
if parentArgs.silent ~= "yes" then
if finalString ~= "" and finalString ~= nil then
return finalString
else
if parentArgs.default then
return parentArgs.default
end
end
end
end
return p