Object
-- Module:SMW local p = {}
-- another example, subobject used inside another function function p.create_object( frame, args )
--page = frame:getParent() local page = nil if args['page'] == nil then page = mw.title.getCurrentTitle() else page = mw.title.new(args['page']) end local namespace = mw.site.namespaces[page.namespace] mw.log(namespace.name) --or page.nsText
if args['custom_id'] ~= nil and args['custom_id'] ~= "" and args['custom_id_pattern'] ~= nil and args['custom_id_replace'] then args['custom_id'] = string.gsub(args['custom_id'], args['custom_id_pattern'], args['custom_id_replace']) end
if args['label'] ~= nil and args['label'] ~= "" and args['name'] ~= nil and args['name'] then args['label'] = args['name'] end
local subobjectId = args['id'] local objectType = args['type'] if objectType == "from_mapping" then objectType = p.getPredecessor( page.fullText .. "#" .. subobjectId ) end --query predecessor material / object
local isInstance = true if page.nsText ~= "LabObject" then isInstance = false end local isGlobal = false if args['global'] ~= nil and args['global'] ~= "" then isGlobal = true end
local display_label = args['label']; if (args['use_as_label'] == "custom_id") and isInstance == true then display_label = args['custom_id'] --don't use id as label in process types elseif (args['use_as_label'] == "id") then display_label = args['id'] end
-- OBJECT PROPERTIES
local properties = {} if args['custom_id'] ~= nil and args['custom_id'] ~= "" then properties['HasId'] = args['custom_id'] else properties['HasId'] = string.gsub(page.fullText, page.nsText .. ":", "") .. "#" .. args['id'] end --LabObject:1ef4...#O0001 -> 1ef4...#O0001 --properties['HasName'] = args['name'] if args['label'] ~= nil then properties['HasLabel'] = args['label'] .. "@en" properties['Display title of'] = display_label end if isInstance == true then properties['IsInstanceOf'] = objectType
else properties['IsA'] = objectType end
if isGlobal == true and isInstance == true then
properties['@category'] = { 'LabProcess/Object', 'LabProcessObject', 'LabProcess/GlobalObject', 'LabProcessOutput' } properties['IsOutputOf'] = page.fullText else properties['@category'] = { 'LabProcess/Object', 'LabProcessObject' }
end -- calculate consumed/remaining quantity
properties["HasQuantifyingQuantity"] = "Property:HasNumberOfEntities" --default properties["HasNumberOfEntities"] = 1 - p.getConsumedQuantity(page.fullText .. "#" .. subobjectId)
mw.logObject(properties)
local result = mw.smw.subobject( properties, subobjectId )
if result == true then -- everything ok mw.log('Your data was stored successfully in a subobject') else -- error message to be found in result.error mw.log('An error occurred during the subobject storage process. Message reads ' .. result.error) end -- PAGE PROPERTIES local page_properties = {} page_properties['HasObject'] = page.fullText .. "#" .. subobjectId if global == true then page_properties['HasOutput'] = page.fullText .. "#" .. subobjectId end result = mw.smw.set( page_properties )
if result == true then -- everything ok return subobjectId .. ";" else -- error message to be found in result.error end
end
-- replaces a number patter with an index, e. g. -- Object0000 -index=32-> Object0013 function p.indexed_string(string_pattern, index) --local pattern = string.match(string_pattern, "%d+") local pattern = string.reverse(string.match(string.reverse(string_pattern), "%d+")) --select the last number group --local pattern = "" --for word in string.gmatch("string_pattern", "%d+") do pattern = word end --select the last number group --local offset = tonumber(pattern) --index = index + offset pattern = string.gsub(pattern, "%d", "0") --reset to e. g. 0001 to 0000 local pattern_len = string.len(pattern) local index_string = "" .. index if (string.len(index_string) < pattern_len) then --auto grow pattern index_string = string.sub(pattern .. index, -pattern_len) end local result = string.reverse(string.gsub(string.reverse(string_pattern), "%d+", string.reverse(index_string), 1)) --replace only the last number group return result end
-- from https://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value function p.copy(obj, seen)
if type(obj) ~= 'table' then return obj end if seen and seen[obj] then return seen[obj] end local s = seen or {} local res = setmetatable({}, getmetatable(obj)) s[obj] = res for k, v in pairs(obj) do res[p.copy(k, s)] = p.copy(v, s) end return res
end
function p.object( frame, reference_only ) local args = p.copy(frame.args) --frame.args is a metatable so we have to create a normal table as copy to edit it
if args['count'] == nil or args['count'] == "" then args['count'] = "1" end local count = tonumber(args['count'])
if args['id'] == nil then args['id'] = "O0000" end if args['label'] == nil then args['label'] = "Object 0" end
local object_ids = "" local custom_id_offset = 0 if args['custom_id_offset'] ~= nil and args['custom_id_offset'] ~= "" then custom_id_offset = tonumber(args['custom_id_offset']) end local id_offset = 0 local label_offset = 0
if count > 1 or (args['custom_id_offset'] ~= nil and args['custom_id_offset'] ~= "") or (args['offset'] ~= nil and args['offset'] ~= "") then --set offset for arrays or if an offset is defined if args['custom_id'] ~= nil and args['custom_id'] ~= "" then if string.match(args['custom_id'], "%d+") == nil then args['custom_id'] = args['custom_id'] .. "0" end -- e. g. "O" -> "O0" if args['offset'] == nil or args['offset'] == "" then custom_id_offset = custom_id_offset + tonumber(string.reverse(string.match(string.reverse("" .. args['custom_id']), "%d+"))) else custom_id_offset = custom_id_offset + tonumber(args['offset']) end end end if count > 1 or (args['offset'] ~= nil and args['offset'] ~= "") then --set offset for arrays or if an offset is defined if string.match(args['id'], "%d+") == nil then args['id'] = args['id'] .. "0" end -- e. g. "O" -> "O0" if string.match(args['label'], "%d+") == nil then args['label'] = args['label'] .. "0" end
if args['offset'] == nil or args['offset'] == "" then id_offset = tonumber(string.reverse(string.match(string.reverse("" .. args['id']), "%d+"))) label_offset = tonumber(string.reverse(string.match(string.reverse("" .. args['label']), "%d+"))) else id_offset = tonumber(args['offset']) label_offset = tonumber(args['offset']) end end
for index = 0, count - 1 do if count > 1 or (args['offset'] ~= nil and args['offset'] ~= "") then --generate indexed strings for arrays or if an offset is defined args['id'] = p.indexed_string( args['id'], index + id_offset) args['label'] = p.indexed_string( args['label'], index + label_offset) end if count > 1 or (args['custom_id_offset'] ~= nil and args['custom_id_offset'] ~= "") then --generate indexed strings for arrays or if an offset is defined if args['custom_id'] ~= nil and args['custom_id'] ~= "" then args['custom_id'] = p.indexed_string( args['custom_id'], index + custom_id_offset) end end --object_ids = object_ids .. args['id'] if reference_only then object_ids = object_ids .. args['id'] .. ";" else object_ids = object_ids .. p.create_object(frame, args) end end return object_ids end
function p.reference( frame ) return p.object( frame, true ) end
function p.getPredecessor(obj) --mw.logObject(obj) -- please note the unlinking of properties 'page authors', and mainlabel '?' by using the #- operator -- note also: unlinking via parameter link is not supported at this point local query = "" .. obj .. " |?HasPredecessor.IsInstanceOf.-HasPredecessor#-=predecessor |mainlabel=- |headers=hide |format=plain" local result = mw.smw.ask( query ) if result ~= nil then --mw.logObject(result) result = result[1]['predecessor'] --mw.logObject(result) end return result end
function p.getConsumedQuantity(obj) --mw.logObject(obj) local query = "" .. obj .. " |headers=hide |?#-=page |mainlabel=- |format=plain" local result = mw.smw.ask( query ) local consumed = 0 if result ~= nil then --mw.logObject(result) for num, row in pairs( result ) do --mw.logObject(row['page']) consumed = consumed + 1 end --mw.logObject(result) end return consumed end
return p
--DEBUG --[[ frame = mw.getCurrentFrame() -- Get a frame object newFrame = frame:newChild{ -- Get one with args title = 'LabObject:OSL02344d31ba6d4e49acc75772946f1ba1' ,
args = {
["page"] = "LabObject:OSL02344d31ba6d4e49acc75772946f1ba1", ["id"] = "O0001", ["custom_id"] = "220504-sist-0100-pi", ["count"] = 3, label="Sample0", use_as_label="custom_id", custom_id_pattern="(%d+)-(%a+)-(%d+)-(%a+)", custom_id_replace="%1-%2-%3-mi", offset="",
}
} mw.log(p.object( newFrame ) ) --]]