Changes

1,934 bytes added ,  13:45, 3 December 2023
Update package: OSW Core
Line 280: Line 280:  
local smw_res = nil
 
local smw_res = nil
 
if (mode == p.mode.header) then
 
if (mode == p.mode.header) then
 +
 +
-- get the semantic properties by looking up the json keys in the json-ld context
 
smw_res = p.getSemanticProperties({jsonschema=jsonschema, jsondata=json_res_store.res, store=false, debug=debug})
 
smw_res = p.getSemanticProperties({jsonschema=jsonschema, jsondata=json_res_store.res, store=false, debug=debug})
 +
 +
-- embed json-ld in resulting html for search engine discovery
 
jsonld["@context"] = smw_res.context
 
jsonld["@context"] = smw_res.context
 
jsonld["@type"] = p.tableMerge(p.tablefy(jsonschema.schema_type), p.tablefy(jsonld["@type"])) --
 
jsonld["@type"] = p.tableMerge(p.tablefy(jsonschema.schema_type), p.tablefy(jsonld["@type"])) --
Line 303: Line 307:  
for i, category in ipairs(schema_res.visited) do
 
for i, category in ipairs(schema_res.visited) do
 
if (mode == p.mode.footer) then category = schema_res.visited[max_index - i +1] end --reverse order for footer templates
 
if (mode == p.mode.footer) then category = schema_res.visited[max_index - i +1] end --reverse order for footer templates
local jsonschema = schema_res.jsonschemas[category]
+
local super_jsonschema = schema_res.jsonschemas[category]
 
local template = schema_res.templates[category]
 
local template = schema_res.templates[category]
 
if (template ~= nil) then
 
if (template ~= nil) then
Line 312: Line 316:  
end
 
end
 
local child = frame:newChild{args=stripped_jsondata}
 
local child = frame:newChild{args=stripped_jsondata}
 +
if ( template:sub(1, #"=") == "=" ) then template = "\n" .. template end -- add line break if template starts with heading (otherwise not rendered by mw parser)
 
wikitext = wikitext .. child:preprocess( template )
 
wikitext = wikitext .. child:preprocess( template )
 
elseif (mode == p.mode.header) then
 
elseif (mode == p.mode.header) then
local infobox_res = p.renderInfoBox({jsonschema=jsonschema, jsondata=jsondata})
+
local ignore_properties = {[p.keys.category]=true} -- don't render type/category on every subclass
 +
for j, subcategory in ipairs(schema_res.visited) do
 +
if j > i then
 +
local subjsonschema = schema_res.jsonschemas[subcategory]
 +
for k, v in pairs(subjsonschema['properties']) do
 +
-- skip properties that are overwritten in subschemas, render them only once at the most specific position
 +
ignore_properties[k] = true
 +
end
 +
end
 +
end
 +
-- render the infobox for the schema itself and every super_schema using always the global json-ld context (merged within walkJsonSchema())
 +
-- context needs to be preprocessed with buildContext() since the generic json/table merge of the @context atttribute produces a list of strings (remote context) and context objects
 +
local infobox_res = p.renderInfoBox({jsonschema=super_jsonschema, context=p.buildContext({jsonschema=jsonschema}).context, jsondata=jsondata, ignore_properties=ignore_properties})
 
wikitext = wikitext .. frame:preprocess( infobox_res.wikitext )
 
wikitext = wikitext .. frame:preprocess( infobox_res.wikitext )
 
end
 
end
Line 327: Line 344:  
if (debug) then msg = msg .. "Store page properties" end
 
if (debug) then msg = msg .. "Store page properties" end
 
smw_res.properties['Display title of'] = display_label --set special property display title
 
smw_res.properties['Display title of'] = display_label --set special property display title
 +
smw_res.properties['Display title of lowercase'] = display_label:lower() --store lowercase for case insensitive query
 +
smw_res.properties['Display title of normalized'] = display_label:lower():gsub('[^%w]+','') --store with all non-alphanumeric chars removed for normalized query
 
mw.ext.displaytitle.set(display_label)
 
mw.ext.displaytitle.set(display_label)
 
--smw_res.properties['@category'] = jsondata[p.keys.category]
 
--smw_res.properties['@category'] = jsondata[p.keys.category]
Line 350: Line 369:  
local jsondata = p.defaultArg(args.jsondata, {})
 
local jsondata = p.defaultArg(args.jsondata, {})
 
local schema = p.defaultArg(args.jsonschema, nil)
 
local schema = p.defaultArg(args.jsonschema, nil)
local context = p.buildContext({jsonschema=schema}).context
  −
local ignore_properties = {[p.keys.category]=true} -- don't render type/category on every subclass
   
local res = ""
 
local res = ""
 
if schema == nil then return res end
 
if schema == nil then return res end
 +
 +
local context = p.defaultArg(args.context, p.buildContext({jsonschema=schema}).context)
 +
local ignore_properties = p.defaultArg(args.ignore_properties, {})
 +
 
local schema_label = ""
 
local schema_label = ""
 
if schema['title'] ~= nil then schema_label = schema['title'] end
 
if schema['title'] ~= nil then schema_label = schema['title'] end
Line 383: Line 404:  
if (type(e) ~= 'table') then  
 
if (type(e) ~= 'table') then  
 
local p_type = p.defaultArgPath(context, {k, '@type'}, '@value')
 
local p_type = p.defaultArgPath(context, {k, '@type'}, '@value')
if (p_type == '@id') then e = "[[" .. string.gsub(e, "Category:", ":Category:") .. "]]" end
+
if (p_type == '@id') then  
 +
e = string.gsub(e, "Category:", ":Category:") -- make sure category links work
 +
e = string.gsub(e, "File:", ":File:") -- do not embedd images but link to them
 +
e = "[[" .. e .. "]]"  
 +
end
 
cell:wikitext("\n* " .. e .. "")  
 
cell:wikitext("\n* " .. e .. "")  
 
end
 
end
Line 389: Line 414:  
else
 
else
 
local p_type = p.defaultArgPath(context, {k, '@type'}, '@value')
 
local p_type = p.defaultArgPath(context, {k, '@type'}, '@value')
if (p_type == '@id') then v = "[[" .. string.gsub(v, "Category:", ":Category:") .. "]]" end
+
if (p_type == '@id') then  
 +
v = string.gsub(v, "Category:", ":Category:") -- make sure category links work
 +
v = string.gsub(v, "File:", ":File:") -- do not embedd images but link to them
 +
v = "[[" .. v .. "]]"  
 +
end
 
cell:wikitext( v )
 
cell:wikitext( v )
 
end
 
end
Line 476: Line 505:  
--]]
 
--]]
    +
-- constructs a property specific local jsonld context
 
function p.buildContext(args)
 
function p.buildContext(args)
 
local schema = p.defaultArg(args.jsonschema, {})
 
local schema = p.defaultArg(args.jsonschema, {})
Line 496: Line 526:  
local properties = p.defaultArg(schema.properties, {})
 
local properties = p.defaultArg(schema.properties, {})
    +
-- build property context
 
for k,v in pairs(properties) do
 
for k,v in pairs(properties) do
 
local subcontext = nil
 
local subcontext = nil
Line 649: Line 680:  
if (jsondata[p.keys.name] ~= nil) then properties['Display title of'] = jsondata[p.keys.name]  
 
if (jsondata[p.keys.name] ~= nil) then properties['Display title of'] = jsondata[p.keys.name]  
 
elseif (jsondata[p.keys.label] ~= nil and jsondata[p.keys.label][1] ~= nil) then properties['Display title of'] = p.splitString(jsondata[p.keys.label][1], '@')[1]  
 
elseif (jsondata[p.keys.label] ~= nil and jsondata[p.keys.label][1] ~= nil) then properties['Display title of'] = p.splitString(jsondata[p.keys.label][1], '@')[1]  
else properties['Display title of'] = p.defaultArg(parent_schema_property.schema_data['title'], "") end
+
else properties['Display title of'] = p.defaultArg(subschema['title'], "") end
 
if (p.tableLength(properties) > 0) then
 
if (p.tableLength(properties) > 0) then
 
store_res = mw.smw.subobject( properties, subobjectId ) --store as subobject
 
store_res = mw.smw.subobject( properties, subobjectId ) --store as subobject
Line 672: Line 703:  
if (statement["HasSubject"] == nil or statement["HasSubject"][1] == nil or statement["HasSubject"][1] == "") then --implicit subject
 
if (statement["HasSubject"] == nil or statement["HasSubject"][1] == nil or statement["HasSubject"][1] == "") then --implicit subject
 
if (statement["HasProperty"] ~= nil and statement["HasProperty"][1] ~= nil and statement["HasProperty"][1] ~= "" and statement["HasObject"] ~= nil) then
 
if (statement["HasProperty"] ~= nil and statement["HasProperty"][1] ~= nil and statement["HasProperty"][1] ~= "" and statement["HasObject"] ~= nil) then
local property = p.splitString(statement["HasProperty"][1], ":")[2]
+
local property = string.gsub(statement["HasProperty"][1], p.keys.property_ns_prefix .. ":", "") -- also allow prefix properties like: Property:schema:url
 
if (debug) then
 
if (debug) then
 
mw.log("Set property " .. property .. " from statement to ")
 
mw.log("Set property " .. property .. " from statement to ")