<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://battery.knowledge-graph.eu/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script</id>
	<title>Battery Knowledge Base - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://battery.knowledge-graph.eu/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script"/>
	<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/wiki/Special:Contributions/Maintenance_script"/>
	<updated>2026-04-05T08:19:56Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=smw/schema:Profile:Facetedsearch_default_profile&amp;diff=3748</id>
		<title>smw/schema:Profile:Facetedsearch default profile</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=smw/schema:Profile:Facetedsearch_default_profile&amp;diff=3748"/>
		<updated>2024-11-18T07:16:53Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Semantic MediaWiki search import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;FACETEDSEARCH_PROFILE_SCHEMA&amp;quot;,&lt;br /&gt;
    &amp;quot;profiles&amp;quot;: {&lt;br /&gt;
        &amp;quot;default_profile&amp;quot;: {&lt;br /&gt;
            &amp;quot;message_key&amp;quot;: &amp;quot;smw-facetedsearch-profile-label-default&amp;quot;,&lt;br /&gt;
            &amp;quot;debug_output&amp;quot;: false,&lt;br /&gt;
            &amp;quot;theme&amp;quot;: &amp;quot;default-theme&amp;quot;,&lt;br /&gt;
            &amp;quot;result&amp;quot;: {&lt;br /&gt;
                &amp;quot;default_limit&amp;quot;: 50,&lt;br /&gt;
                &amp;quot;paging_limit&amp;quot;: [&lt;br /&gt;
                    10,&lt;br /&gt;
                    20,&lt;br /&gt;
                    50,&lt;br /&gt;
                    250,&lt;br /&gt;
                    500&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;filters&amp;quot;: {&lt;br /&gt;
                &amp;quot;property_filter&amp;quot;: {&lt;br /&gt;
                    &amp;quot;hierarchy_tree&amp;quot;: false,&lt;br /&gt;
                    &amp;quot;filter_input&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min_item&amp;quot;: 10&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;category_filter&amp;quot;: {&lt;br /&gt;
                    &amp;quot;hierarchy_tree&amp;quot;: false,&lt;br /&gt;
                    &amp;quot;filter_input&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min_item&amp;quot;: 10&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;value_filter&amp;quot;: {&lt;br /&gt;
                    &amp;quot;default_filter&amp;quot;: &amp;quot;list_filter&amp;quot;,&lt;br /&gt;
                    &amp;quot;condition_field&amp;quot;: false,&lt;br /&gt;
                    &amp;quot;filter_input&amp;quot;: {&lt;br /&gt;
                        &amp;quot;min_item&amp;quot;: 10&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;tags&amp;quot;: [&lt;br /&gt;
        &amp;quot;faceted search&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:Entity&amp;diff=2492</id>
		<title>Category:Entity</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:Entity&amp;diff=2492"/>
		<updated>2024-07-06T02:22:31Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Module:MwJson&amp;diff=2491</id>
		<title>Module:MwJson</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Module:MwJson&amp;diff=2491"/>
		<updated>2024-07-06T02:22:31Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- mw.logObject(p.processJsondata({jsondata=p.loadJson({title=&amp;quot;Item:OSW7d7193567ea14e4e89b74de88983b718&amp;quot;, slot=&amp;quot;jsondata&amp;quot;}).json, debug=true, mode=&amp;quot;header&amp;quot;}))&lt;br /&gt;
&lt;br /&gt;
local lustache = require(&amp;quot;Module:Lustache&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local p = {} --p stands for package&lt;br /&gt;
&lt;br /&gt;
p.keys = { --jsonschema / json-ld keys&lt;br /&gt;
	category=&#039;type&#039;, &lt;br /&gt;
	category_pseudoproperty=&#039;Category&#039;, -- Property:Category&lt;br /&gt;
	subcategory=&#039;subclass_of&#039;,&lt;br /&gt;
	schema_type=&#039;schema_type&#039;,&lt;br /&gt;
	property_ns_prefix=&#039;Property&#039;,&lt;br /&gt;
	schema=&#039;osl_schema&#039;, &lt;br /&gt;
	template=&#039;eval_template&#039;,&lt;br /&gt;
	mode=&#039;mode&#039;,&lt;br /&gt;
	context=&#039;@context&#039;,&lt;br /&gt;
	allOf=&#039;allOf&#039;,&lt;br /&gt;
	label=&#039;label&#039;,&lt;br /&gt;
	name=&#039;name&#039;,&lt;br /&gt;
	description=&#039;description&#039;,&lt;br /&gt;
	text=&#039;text&#039;,&lt;br /&gt;
	debug=&#039;_debug&#039;&lt;br /&gt;
} &lt;br /&gt;
p.slots = { --slot names&lt;br /&gt;
	jsondata=&#039;jsondata&#039;, &lt;br /&gt;
	jsonschema=&#039;jsonschema&#039;, &lt;br /&gt;
	header_template=&#039;header_template&#039;,&lt;br /&gt;
	footer_template=&#039;footer_template&#039;,&lt;br /&gt;
	data_template=&#039;data_template&#039;&lt;br /&gt;
} &lt;br /&gt;
p.mode = {&lt;br /&gt;
	header=&#039;header&#039;,&lt;br /&gt;
	footer=&#039;footer&#039;,&lt;br /&gt;
	query=&#039;query&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--loads json from a wiki page&lt;br /&gt;
--test: mw.logObject(p.loadJson({title=&amp;quot;JsonSchema:Entity&amp;quot;}))&lt;br /&gt;
--test: mw.logObject(p.loadJson({title=&amp;quot;Category:Entity&amp;quot;, slot=&amp;quot;jsonschema&amp;quot;}))&lt;br /&gt;
function p.loadJson(args)&lt;br /&gt;
	local page_title = p.defaultArg(args.title, &amp;quot;JsonSchema:Entity&amp;quot;) --for testing&lt;br /&gt;
	local slot = p.defaultArg(args.slot, nil)&lt;br /&gt;
	local debug = p.defaultArg(args.debug, nil)&lt;br /&gt;
	local msg = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local json = {}&lt;br /&gt;
	&lt;br /&gt;
	if (slot == nil) then&lt;br /&gt;
		--json = mw.loadJsonData( &amp;quot;JsonSchema:Entity&amp;quot; ) --requires MediaWiki 1.39&lt;br /&gt;
		local page = mw.title.makeTitle(p.splitString(page_title, &#039;:&#039;)[1], p.splitString(page_title, &#039;:&#039;)[2])&lt;br /&gt;
		local text = page:getContent()&lt;br /&gt;
		if (text ~= nil) then json = mw.text.jsonDecode(text) end&lt;br /&gt;
	else&lt;br /&gt;
		if (debug) then msg = msg .. &amp;quot;Fetch slot &amp;quot; .. p.slots.jsondata .. &amp;quot; from page &amp;quot; .. title .. &amp;quot;&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
		local text = mw.slots.slotContent( slot , page_title )&lt;br /&gt;
		if (text ~= nil) then json = mw.text.jsonDecode(text) end&lt;br /&gt;
	end	&lt;br /&gt;
	&lt;br /&gt;
	--mw.logObject(json)&lt;br /&gt;
&lt;br /&gt;
	return {json=json, debug_msg=msg}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- test: mw.logObject(p.walkJsonSchema({jsonschema=p.loadJson({title=&amp;quot;Category:Hardware&amp;quot;, slot=&amp;quot;jsonschema&amp;quot;}).json, debug=true}).jsonschema)&lt;br /&gt;
function p.walkJsonSchema(args)&lt;br /&gt;
	local jsonschema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local jsonschemas = p.defaultArg(args.jsonschemas, {})&lt;br /&gt;
	local categories = p.defaultArg(args.categories, nil)&lt;br /&gt;
	local visited = p.defaultArg(args.visited, {})&lt;br /&gt;
	local mode = p.defaultArg(args.mode, p.mode.header)&lt;br /&gt;
	--local merged_jsonschema = p.defaultArg(args.merged_jsonschema, {})&lt;br /&gt;
	local templates = p.defaultArg(args.templates, {})&lt;br /&gt;
	local recursive = p.defaultArg(args.recursive, true)&lt;br /&gt;
	local root = p.defaultArg(args.root, true)&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
	local msg = &amp;quot;&amp;quot;&lt;br /&gt;
	local wikitext = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local category_template_slot = nil&lt;br /&gt;
	if (mode == p.mode.footer) then category_template_slot = p.slots.footer_template end&lt;br /&gt;
	if (mode == p.mode.header) then category_template_slot = p.slots.header_template end&lt;br /&gt;
	&lt;br /&gt;
	if (categories == nil) then categories = p.getCategories({jsonschema=jsonschema, includeNamespace=true}).categories end&lt;br /&gt;
	if (type(categories) ~= &#039;table&#039;) then categories = {categories} end&lt;br /&gt;
	if (debug) then msg = msg .. &amp;quot;Supercategories: &amp;quot; .. mw.dumpObject(categories) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	for k, category in pairs(categories) do&lt;br /&gt;
		if (not p.tableContains(visited, category)) then&lt;br /&gt;
			--mw.logObject(&amp;quot;Visit &amp;quot; .. category)&lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;Fetch slot &amp;quot; .. p.slots.jsonschema .. &amp;quot; from page &amp;quot; .. category .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
			local super_jsonschema_str = mw.slots.slotContent( p.slots.jsonschema , category )&lt;br /&gt;
			if (super_jsonschema_str ~= nil) then&lt;br /&gt;
				super_jsonschema = mw.text.jsonDecode( super_jsonschema_str )&lt;br /&gt;
				if (recursive) then	&lt;br /&gt;
					local res = p.walkJsonSchema({jsonschema=super_jsonschema, jsonschemas=jsonschemas, templates=templates, mode=mode, visited=visited, root=false})&lt;br /&gt;
					wikitext = wikitext .. res.wikitext &lt;br /&gt;
				end&lt;br /&gt;
				--table.insert(jsonschemas, mw.text.jsonDecode( super_jsonschema_str )) --keep a copy of the schema, super_jsonschema passed by references gets modified&lt;br /&gt;
				--table.insert(jsonschemas, super_jsonschema ) &lt;br /&gt;
				--mw.logObject(&amp;quot;Store &amp;quot; .. category)&lt;br /&gt;
				table.insert(visited, category)&lt;br /&gt;
				jsonschemas[category] = mw.text.jsonDecode( super_jsonschema_str ) --keep a copy of the schema, super_jsonschema passed by references gets modified&lt;br /&gt;
				--jsonschema = p.tableMerge(jsonschema, super_jsonschema) --merge superschema is done by the caller&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;Fetch slot &amp;quot; .. category_template_slot .. &amp;quot; from page &amp;quot; .. category .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
			templates[category] = mw.slots.slotContent( category_template_slot , category )&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	if (root) then&lt;br /&gt;
		for i, category in ipairs(visited) do&lt;br /&gt;
			--merge all schemas. we need to make a copy here, otherwise jsonschemas[&amp;quot;Category:Entity&amp;quot;] contains the merged schema&lt;br /&gt;
			jsonschema = p.copy(p.tableMerge(jsonschema, jsonschemas[category])) &lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	if (debug) then wikitext = msg .. wikitext  end&lt;br /&gt;
	return {jsonschema=jsonschema, jsonschemas=jsonschemas, templates=templates, visited=visited, wikitext=wikitext}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ test: &lt;br /&gt;
category = &amp;quot;Category:Hardware&amp;quot;&lt;br /&gt;
page = &amp;quot;Item:OSW7d7193567ea14e4e89b74de88983b718&amp;quot;&lt;br /&gt;
category2 = &amp;quot;Category:OSW80e240a2e17d4ae5adfe6419051aa0bb&amp;quot;&lt;br /&gt;
page2 = &amp;quot;Item:OSWa4da6664aeac466a86b09e6b32a1cb41&amp;quot;&lt;br /&gt;
mw.logObject(p.expandEmbeddedTemplates({&lt;br /&gt;
	jsonschema=p.walkJsonSchema({jsonschema=p.loadJson({title=category, slot=&amp;quot;jsonschema&amp;quot;}).json, debug=true}).jsonschema, &lt;br /&gt;
	jsondata=p.loadJson({title=page, slot=&amp;quot;jsondata&amp;quot;}).json,&lt;br /&gt;
	debug=true, mode=&amp;quot;render&amp;quot;&lt;br /&gt;
}).res)&lt;br /&gt;
--]]&lt;br /&gt;
function p.expandEmbeddedTemplates(args)&lt;br /&gt;
	local frame = p.defaultArg(args.frame, mw.getCurrentFrame())&lt;br /&gt;
	local jsondata = p.defaultArg(args.jsondata, {})&lt;br /&gt;
	local jsonschema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local template = p.defaultArg(args.template, nil)&lt;br /&gt;
	local mode = p.defaultArg(args.mode, nil)&lt;br /&gt;
	local stringify_arrays = p.defaultArg(args.stringify_arrays, false)&lt;br /&gt;
	local msg = &amp;quot;&amp;quot;&lt;br /&gt;
	local res = p.defaultArg(args.jsondata, &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	for k,v in pairs(jsondata) do&lt;br /&gt;
		local eval_template = nil&lt;br /&gt;
		local eval_templates = p.defaultArgPath(jsonschema, {&amp;quot;properties&amp;quot;, k, p.keys.template}, {})&lt;br /&gt;
		if (eval_templates[1] == nil) then eval_templates = {eval_templates} end --ensure list of objects&lt;br /&gt;
		for i, t in pairs(eval_templates) do&lt;br /&gt;
			if (t[p.keys.mode] ~= nil and t[p.keys.mode] == mode) then eval_template = t --use only render templates in render mode and store templates in store mode&lt;br /&gt;
			elseif (t[p.keys.mode] == nil) then  eval_template = t --default&lt;br /&gt;
			elseif (debug) then msg = msg .. &amp;quot;Ignore eval_template&amp;quot; .. mw.dumpObject( t ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if (eval_template ~= nil and eval_template.value ~= nil and (eval_template.type == &amp;quot;mustache&amp;quot; or eval_template.type == &amp;quot;mustache-wikitext&amp;quot;)) then&lt;br /&gt;
			-- mustache can handle objects and array to we can parse it directly&lt;br /&gt;
			-- todo: handle nested templates&lt;br /&gt;
			local template_param = {[k]=v}&lt;br /&gt;
			if (eval_template.root_key == false) then template_param = v end&lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;Parse mustache template &amp;quot; .. eval_template.value .. &amp;quot; with params &amp;quot; .. mw.dumpObject( template_param ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
			jsondata[k] = lustache:render(eval_template.value, template_param, p.tableMerge({self=eval_template.value}, eval_template.partials)) -- render with self as registered partial for recursion&lt;br /&gt;
			if (eval_template.type == &amp;quot;mustache-wikitext&amp;quot;) then &lt;br /&gt;
				jsondata[k] = frame:preprocess( jsondata[k] )&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(v) == &#039;table&#039; then &lt;br /&gt;
			if (v[1] == nil) then --key value array = object/dict&lt;br /&gt;
				local sub_res = p.expandEmbeddedTemplates({frame=frame, jsondata=v, jsonschema=p.defaultArgPath(jsonschema, {&amp;quot;properties&amp;quot;, k}, {}), template=eval_template, mode=mode, stringify_arrays=stringify_arrays})&lt;br /&gt;
				msg = msg .. sub_res.debug_msg&lt;br /&gt;
				jsondata[k] = sub_res.res&lt;br /&gt;
				--if (sub_res.unparsed ~= nil) then jsondata[k] = sub_res.unparsed else jsondata[k] = sub_res.wikitext end&lt;br /&gt;
			else --list array&lt;br /&gt;
				local string_list = &amp;quot;&amp;quot;&lt;br /&gt;
				for i,e in pairs(v) do &lt;br /&gt;
					&lt;br /&gt;
					local eval_template = nil&lt;br /&gt;
					local eval_templates = p.defaultArgPath(jsonschema, {&amp;quot;properties&amp;quot;, k, &amp;quot;items&amp;quot;, p.keys.template}, {})&lt;br /&gt;
					if (eval_templates[1] == nil) then eval_templates = {eval_templates} end --ensure list of objects&lt;br /&gt;
					&lt;br /&gt;
					for i, t in pairs(eval_templates) do&lt;br /&gt;
						if (t[p.keys.mode] ~= nil and t[p.keys.mode] == mode) then eval_template = t --use only render templates in render mode and store templates in store mode&lt;br /&gt;
						elseif (t[p.keys.mode] == nil) then  eval_template = t --default&lt;br /&gt;
						elseif (debug) then msg = msg .. &amp;quot;Ignore eval_template&amp;quot; .. mw.dumpObject( t ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					if type(e) == &#039;table&#039; then 	&lt;br /&gt;
						local sub_res = p.expandEmbeddedTemplates({frame=frame, jsondata=e, jsonschema=p.defaultArgPath(jsonschema, {&amp;quot;properties&amp;quot;, k, &amp;quot;items&amp;quot;}, {}), template=eval_template, mode=mode, stringify_arrays=stringify_arrays})&lt;br /&gt;
						msg = msg .. sub_res.debug_msg&lt;br /&gt;
						if (type(sub_res.res) == &#039;table&#039;) then &lt;br /&gt;
							if (debug) then msg = msg .. &amp;quot;Values for &amp;quot; .. k .. &amp;quot; contains non-literal items: &amp;quot; .. mw.dumpObject( sub_res.res ) .. &amp;quot; =&amp;gt; skip value in wikitemplate array param creation\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
						else &lt;br /&gt;
							if (stringify_arrays) then string_list = string_list .. sub_res.res .. &amp;quot;;&amp;quot; &lt;br /&gt;
							else v[i] = sub_res.res end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						if (eval_template ~= nil and eval_template.value ~= nil) then&lt;br /&gt;
							&lt;br /&gt;
							--evaluate single array item string as json {&amp;quot;self&amp;quot;: &amp;quot;&amp;lt;value&amp;gt;&amp;quot;, &amp;quot;.&amp;quot;: &amp;quot;&amp;lt;value&amp;gt;&amp;quot;} =&amp;gt; does not work since jsondata is an object&lt;br /&gt;
							--e = p.expandEmbeddedTemplates({frame=frame, jsondata={[&amp;quot;self&amp;quot;]=e,[&amp;quot;.&amp;quot;]=e}, jsonschema=p.defaultArgPath(jsonschema, {&amp;quot;properties&amp;quot;, k, &amp;quot;items&amp;quot;}, {}), template=eval_template, mode=mode, stringify_arrays=stringify_arrays})&lt;br /&gt;
							&lt;br /&gt;
&lt;br /&gt;
							if (eval_template.type == &amp;quot;mustache&amp;quot; or eval_template.type == &amp;quot;mustache-wikitext&amp;quot;) then&lt;br /&gt;
								if (debug) then msg = msg .. &amp;quot;Parse mustache template &amp;quot; .. eval_template.value .. &amp;quot; with params &amp;quot; .. mw.dumpObject( e ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
								-- {{.}} in the template will be the value of e&lt;br /&gt;
								e = lustache:render(eval_template.value, e, p.tableMerge({self=eval_template.value}, eval_template.partials)) -- render with self as registered partial for recursion&lt;br /&gt;
							end&lt;br /&gt;
							if (eval_template.type == &amp;quot;mustache-wikitext&amp;quot;) then --or eval_template.type == &amp;quot;wikitext&amp;quot;) then &lt;br /&gt;
								if (debug) then msg = msg .. &amp;quot;Parse wikitext template &amp;quot; .. e .. &amp;quot; with params &amp;quot; .. mw.dumpObject( e ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
								e = frame:preprocess( e )&lt;br /&gt;
							end&lt;br /&gt;
							v[i] = e -- update array&lt;br /&gt;
						end&lt;br /&gt;
						if (stringify_arrays) then string_list = string_list .. e .. &amp;quot;;&amp;quot; end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				if (stringify_arrays) then jsondata[k] = string_list end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if (template == nil) then &lt;br /&gt;
		local templates = jsondata[p.keys.template]&lt;br /&gt;
		if (templates == nil) then templates = p.defaultArg(jsonschema[p.keys.template], {}) end&lt;br /&gt;
		if (templates[1] == nil) then templates = {templates} end --ensure list of objects&lt;br /&gt;
		for i, t in pairs(templates) do&lt;br /&gt;
			if (t[p.keys.mode] ~= nil and t[p.keys.mode] == mode) then template = t --use only render templates in render mode and store templates in store mode&lt;br /&gt;
			elseif (t[p.keys.mode] == nil) then  template = t --default&lt;br /&gt;
			elseif (debug) then msg = msg .. &amp;quot;Ignore template&amp;quot; .. mw.dumpObject( t ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if template ~= nil then&lt;br /&gt;
		if (template.type == &amp;quot;wikitext&amp;quot;) then&lt;br /&gt;
			for k,v in pairs(jsondata) do&lt;br /&gt;
				if type(v) == &#039;table&#039; then &lt;br /&gt;
					if (debug) then msg = msg .. &amp;quot;Values for &amp;quot; .. k .. &amp;quot; contains non-literals: &amp;quot; .. mw.dumpObject( v ) .. &amp;quot; =&amp;gt; skip wikitemplate parsing\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
					return {res=res, debug_msg=msg} &lt;br /&gt;
				end --not supported&lt;br /&gt;
			end			&lt;br /&gt;
			if (template.value ~= nil) then&lt;br /&gt;
				if (debug) then msg = msg .. &amp;quot;Parse wikitemplate &amp;quot; .. template.value .. &amp;quot; with params &amp;quot; .. mw.dumpObject( jsondata ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
				local child = frame:newChild{args=jsondata}&lt;br /&gt;
				res = child:preprocess( template.value )&lt;br /&gt;
			elseif (template.page ~= nil) then&lt;br /&gt;
				if (debug) then msg = msg .. &amp;quot;Parse wikitemplate &amp;quot; .. template.page .. &amp;quot; with params &amp;quot; .. mw.dumpObject( jsondata ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
				res = frame:expandTemplate{ title = template.page, args = jsondata }&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--if (debug) then mw.logObject(msg) end&lt;br /&gt;
	return {res=res, debug_msg=msg}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- mw.logObject(p.processJsondata({jsondata=p.loadJson({title=&amp;quot;Item:OSW7d7193567ea14e4e89b74de88983b718&amp;quot;, slot=&amp;quot;jsondata&amp;quot;}).json, debug=true, mode=&amp;quot;header&amp;quot;}))&lt;br /&gt;
-- mw.logObject(p.processJsondata({jsondata=p.loadJson({title=&amp;quot;Item:OSWa4da6664aeac466a86b09e6b32a1cb41&amp;quot;, slot=&amp;quot;jsondata&amp;quot;}).json, debug=true, mode=&amp;quot;header&amp;quot;}))&lt;br /&gt;
-- mw.logObject(p.processJsondata({jsondata=p.loadJson({title=&amp;quot;Category:OSWb3022bbf7e7146eb8e6f6e3264f50bbe&amp;quot;, slot=&amp;quot;jsondata&amp;quot;}).json, debug=true, mode=&amp;quot;header&amp;quot;, categories={&amp;quot;Category:Category&amp;quot;}}))&lt;br /&gt;
function p.processJsondata(args)&lt;br /&gt;
	local frame = p.defaultArg(args.frame, mw.getCurrentFrame())&lt;br /&gt;
	local jsondata = p.defaultArg(args.jsondata, {})&lt;br /&gt;
	local jsonschema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local template = p.defaultArg(args.template, nil)&lt;br /&gt;
	local categories = p.defaultArg(args.categories, nil)&lt;br /&gt;
	local recursive = p.defaultArg(args.recursive, true)&lt;br /&gt;
	local mode = p.defaultArg(args.mode, p.mode.header)&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	&lt;br /&gt;
	local wikitext = &amp;quot;&amp;quot;&lt;br /&gt;
	local msg = &amp;quot;&amp;quot; --debug msg&lt;br /&gt;
&lt;br /&gt;
	if (p.nilOrEmpty(jsondata) or (p.nilOrEmpty(categories) and p.nilOrEmpty(jsonschema) and p.nilOrEmpty(jsondata[p.keys.category]))) then return {wikitext=wikitext, debug_msg=msg} end --nothing to do here&lt;br /&gt;
	--if (jsondata == nil or p.tableLength(jsondata) == 0 or (categories == nil and jsonschema == nil and jsondata[p.keys.category] == nil)) then return {wikitext=wikitext, debug_msg=msg} end --nothing to do here&lt;br /&gt;
	--jsonschema = p.defaultArg(jsonschema, {})&lt;br /&gt;
	--jsondata = p.defaultArg(jsondata, {})&lt;br /&gt;
	--if (categories == nil) then categories = jsondata[p.keys.category] end -- let function param overwrite json property&lt;br /&gt;
	if (not p.nilOrEmpty(jsondata[p.keys.category])) then categories = jsondata[p.keys.category] end -- let json property overwrite function param&lt;br /&gt;
	&lt;br /&gt;
	local schema_res = p.walkJsonSchema({jsonschema=jsonschema, categories=categories, mode=mode, recursive=recursive, debug=debug})&lt;br /&gt;
	local expand_res = p.expandJsonRef({json=schema_res.jsonschema, debug=debug})&lt;br /&gt;
	jsonschema = expand_res.json&lt;br /&gt;
	--mw.log(mw.text.jsonEncode(jsonschema))&lt;br /&gt;
	&lt;br /&gt;
	local display_label = p.defaultArgPath(jsondata, {p.keys.name}, &amp;quot;&amp;quot;)&lt;br /&gt;
	if (display_label == &amp;quot;&amp;quot; or (title.nsText ~= &amp;quot;Category&amp;quot; and title.nsText ~= &amp;quot;Property&amp;quot;)) then &lt;br /&gt;
		display_label = p.defaultArgPath(jsondata, {p.keys.label, 1, p.keys.text}, &amp;quot;&amp;quot;) --prefere label for all non-category and non-property pages&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	local jsonld = p.copy(jsondata)&lt;br /&gt;
	local json_data_store = p.copy(jsondata)&lt;br /&gt;
	local json_data_render = p.copy(jsondata)&lt;br /&gt;
	json_res_store = p.expandEmbeddedTemplates({jsonschema=jsonschema, jsondata=json_data_store, mode=&#039;store&#039;})&lt;br /&gt;
	msg = msg .. json_res_store.debug_msg&lt;br /&gt;
	--mw.log(&amp;quot;JSONDATA STORE&amp;quot;)&lt;br /&gt;
	--mw.logObject(json_res_store.res)&lt;br /&gt;
	&lt;br /&gt;
	local smw_res = nil&lt;br /&gt;
	if (mode == p.mode.header) then&lt;br /&gt;
&lt;br /&gt;
		-- get the semantic properties by looking up the json keys in the json-ld context&lt;br /&gt;
		smw_res = p.getSemanticProperties({jsonschema=jsonschema, jsondata=json_res_store.res, store=false, debug=debug})&lt;br /&gt;
		&lt;br /&gt;
		-- store metadata where properties were defined / overridden&lt;br /&gt;
		for i, category in ipairs(schema_res.visited) do &lt;br /&gt;
			for k, v in pairs(schema_res.jsonschemas[category][&#039;properties&#039;]) do&lt;br /&gt;
				if smw_res.definitions[k] == nil then smw_res.definitions[k] = {} end&lt;br /&gt;
				if smw_res.definitions[k][&#039;defined_in&#039;] == nil then smw_res.definitions[k][&#039;defined_in&#039;] = {} end&lt;br /&gt;
				table.insert(smw_res.definitions[k][&#039;defined_in&#039;], category)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- embed json-ld in resulting html for search engine discovery&lt;br /&gt;
		jsonld[&amp;quot;@context&amp;quot;] = smw_res.context&lt;br /&gt;
		jsonld[&amp;quot;@type&amp;quot;] = p.tableMerge(p.tablefy(jsonschema.schema_type), p.tablefy(jsonld[&amp;quot;@type&amp;quot;])) --&lt;br /&gt;
		jsonld[&#039;schema:name&#039;] = p.defaultArgPath(jsonld, {p.keys.label, 1, p.keys.text}, jsonld[&#039;name&#039;]) --google does not support @value and @lang&lt;br /&gt;
		jsonld[&#039;schema:description&#039;] = p.defaultArgPath(jsonld, {p.keys.description, 1, p.keys.text}, nil)&lt;br /&gt;
		for k, v in pairs(jsonld) do&lt;br /&gt;
			if (type(v) == &amp;quot;string&amp;quot;) then&lt;br /&gt;
				local vpart = p.splitString(v, &#039;:&#039;)&lt;br /&gt;
				if (p.tableLength(vpart) == 2 and vpart[1] == &amp;quot;File&amp;quot;) then jsonld[k] = mw.getCurrentFrame():callParserFunction( &#039;filepath&#039;, { vpart[2] } ) end --google does not follow redirects via &amp;quot;File&amp;quot;:&amp;quot;wiki:Special:Redirect/file/&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		wikitext = wikitext .. &amp;quot;&amp;lt;div class=&#039;jsonld-header&#039; style=&#039;display:none&#039; data-jsonld=&#039;&amp;quot; .. mw.text.jsonEncode( jsonld ):gsub(&amp;quot;&#039;&amp;quot;,&amp;quot;`&amp;quot;) .. &amp;quot;&#039;&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local json_res = p.expandEmbeddedTemplates({jsonschema=jsonschema, jsondata=json_data_render, mode=&#039;render&#039;})&lt;br /&gt;
	msg = msg .. json_res.debug_msg&lt;br /&gt;
	jsondata =json_res.res&lt;br /&gt;
	--mw.log(&amp;quot;JSONDATA RENDER&amp;quot;)&lt;br /&gt;
	--mw.logObject(jsondata)&lt;br /&gt;
&lt;br /&gt;
	local max_index = p.tableLength(schema_res.visited)&lt;br /&gt;
	for i, category in ipairs(schema_res.visited) do&lt;br /&gt;
		if (mode == p.mode.footer) then category = schema_res.visited[max_index - i +1] end --reverse order for footer templates&lt;br /&gt;
		local super_jsonschema = schema_res.jsonschemas[category]&lt;br /&gt;
		local template = schema_res.templates[category]&lt;br /&gt;
		if (template ~= nil) then&lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;Parse \n\n&amp;quot; .. template .. &amp;quot; \n\nwith params &amp;quot; .. mw.dumpObject( jsondata ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
			local stripped_jsondata={}&lt;br /&gt;
			for k, v in pairs(jsondata) do&lt;br /&gt;
				if (type(v) ~= &#039;table&#039;) then stripped_jsondata[k] = v end --delete object values, not supported by wiki templates	&lt;br /&gt;
			end&lt;br /&gt;
			local child = frame:newChild{args=stripped_jsondata}&lt;br /&gt;
			if ( template:sub(1, #&amp;quot;=&amp;quot;) == &amp;quot;=&amp;quot; ) then template = &amp;quot;\n&amp;quot; .. template end -- add line break if template starts with heading (otherwise not rendered by mw parser)&lt;br /&gt;
			wikitext = wikitext .. child:preprocess( template )&lt;br /&gt;
		elseif (mode == p.mode.header) then&lt;br /&gt;
			local ignore_properties = {[p.keys.category]=true} -- don&#039;t render type/category on every subclass&lt;br /&gt;
			for j, subcategory in ipairs(schema_res.visited) do&lt;br /&gt;
				if j &amp;gt; i then&lt;br /&gt;
					local subjsonschema = schema_res.jsonschemas[subcategory]&lt;br /&gt;
					for k, v in pairs(subjsonschema[&#039;properties&#039;]) do&lt;br /&gt;
						-- skip properties that are overwritten in subschemas, render them only once at the most specific position&lt;br /&gt;
						ignore_properties[k] = true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- render the infobox for the schema itself and every super_schema using always the global json-ld context (merged within walkJsonSchema())&lt;br /&gt;
			-- 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&lt;br /&gt;
			-- context is already build in p.getSemanticProperties. schema_allOfMerged is used to provide the full schema for overridden properties&lt;br /&gt;
			local infobox_res = p.renderInfoBox({jsonschema=super_jsonschema, schema_allOfMerged=jsonschema, context=smw_res.context, property_definitions=smw_res.definitions, jsondata=jsondata, ignore_properties=ignore_properties})&lt;br /&gt;
			wikitext = wikitext .. frame:preprocess( infobox_res.wikitext )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--local display_label = &amp;quot;&amp;quot;&lt;br /&gt;
	--if (jsondata[p.keys.label] ~= nil) then display_label = p.splitString(jsondata[p.keys.label], &#039;@&#039;)[1] end&lt;br /&gt;
	local set_categories_in_wikitext = {}&lt;br /&gt;
	p.tableMerge(set_categories_in_wikitext, json_res_store.res[p.keys.subcategory])  --classes/categories, nil for items&lt;br /&gt;
	if (title.nsText ~= &amp;quot;Category&amp;quot;) then --items&lt;br /&gt;
		p.tableMerge(set_categories_in_wikitext, json_res_store.res[p.keys.category]) -- categories from schema type&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Todo: Consider moving the category and this block to p.getSemanticProperties with store=true. However, settings categories with @category is only possible for subobjects&lt;br /&gt;
	if (smw_res ~= nil) then&lt;br /&gt;
		if (debug) then msg = msg .. &amp;quot;Store page properties&amp;quot; end&lt;br /&gt;
		-- category handling&lt;br /&gt;
		p.tableMerge(set_categories_in_wikitext, smw_res.properties[p.keys.category_pseudoproperty]) &lt;br /&gt;
		smw_res.properties[p.keys.category_pseudoproperty] = nil -- delete pseudo property&lt;br /&gt;
		&lt;br /&gt;
		smw_res.properties[&#039;HasOswId&#039;] = mw.title.getCurrentTitle().fullText  --set special property OswId to own title&lt;br /&gt;
		&lt;br /&gt;
		-- label and display title handling&lt;br /&gt;
		smw_res.properties[&#039;Display title of&#039;] = display_label --set special property display title&lt;br /&gt;
		smw_res.properties[&#039;Display title of lowercase&#039;] = display_label:lower() --store lowercase for case insensitive query&lt;br /&gt;
		smw_res.properties[&#039;Display title of normalized&#039;] = display_label:lower():gsub(&#039;[^%w]+&#039;,&#039;&#039;) --store with all non-alphanumeric chars removed for normalized query&lt;br /&gt;
		p.setNormalizedLabel(smw_res.properties) --build normalized multilang label&lt;br /&gt;
		mw.ext.displaytitle.set(display_label)&lt;br /&gt;
		--smw_res.properties[&#039;@category&#039;] = jsondata[p.keys.category]&lt;br /&gt;
		local store_res = mw.smw.set( smw_res.properties ) --store as semantic properties&lt;br /&gt;
		if (debug) then msg = msg .. mw.dumpObject(smw_res.properties) end&lt;br /&gt;
		if (store_res) then &lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;SMW SUCCESS: &amp;quot; end&lt;br /&gt;
		else&lt;br /&gt;
			wikitext = wikitext .. store_res.error &lt;br /&gt;
			if (debug) then msg = msg .. &amp;quot;SMW ERROR: &amp;quot; .. store_res.error end&lt;br /&gt;
		end&lt;br /&gt;
		--wikitext = mw.dumpObject(smw_res.properties) .. wikitext&lt;br /&gt;
	end&lt;br /&gt;
	wikitext = wikitext .. &amp;quot;\n&amp;quot; .. p.setCategories({categories=set_categories_in_wikitext, sortkey=display_label}).wikitext&lt;br /&gt;
	&lt;br /&gt;
	if (debug) then mw.logObject(res) end&lt;br /&gt;
	return {wikitext=wikitext, debug_msg=msg}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- renders a default infobox&lt;br /&gt;
-- test: mw.logObject(p.renderInfoBox({jsonschema=p.loadJson({title=&amp;quot;JsonSchema:Entity&amp;quot;}).json, jsondata={uuid=&amp;quot;123123&amp;quot;}}))&lt;br /&gt;
function p.renderInfoBox(args)&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
	local jsondata = p.defaultArg(args.jsondata, {})&lt;br /&gt;
	local schema = p.defaultArg(args.jsonschema, nil) -- local schema from the perspective of the current category&lt;br /&gt;
	local schema_allOfMerged = p.defaultArg(args.schema_allOfMerged, schema) -- global schema with allOfs merged&lt;br /&gt;
	local property_definitions = p.defaultArg(args.property_definitions, {}) -- dict schema_key: {property: &amp;lt;smw_property&amp;gt;, ...}&lt;br /&gt;
	local res = &amp;quot;&amp;quot;&lt;br /&gt;
	if schema == nil then return res end&lt;br /&gt;
	&lt;br /&gt;
	local context = p.defaultArg(args.context, p.buildContext({jsonschema=schema}).context)&lt;br /&gt;
	local ignore_properties = p.defaultArg(args.ignore_properties, {})&lt;br /&gt;
&lt;br /&gt;
	local schema_label = &amp;quot;&amp;quot;&lt;br /&gt;
	if schema[&#039;title&#039;] ~= nil then schema_label = schema[&#039;title&#039;] end&lt;br /&gt;
	&lt;br /&gt;
	-- see also: https://help.fandom.com/wiki/Extension:Scribunto/HTML_Library_usage_notes&lt;br /&gt;
	local tbl = mw.html.create( &#039;table&#039; )&lt;br /&gt;
	tbl&lt;br /&gt;
		:attr( &#039;class&#039;, &#039;info_box&#039; )&lt;br /&gt;
		:tag( &#039;tr&#039; )&lt;br /&gt;
			:tag( &#039;th&#039; )&lt;br /&gt;
				:attr( &#039;class&#039;, &#039;heading&#039; )&lt;br /&gt;
				:attr( &#039;colspan&#039;, &#039;2&#039; )&lt;br /&gt;
				:wikitext( schema_label )&lt;br /&gt;
	for k,v in pairs(jsondata) do&lt;br /&gt;
		if (not ignore_properties[k]) then&lt;br /&gt;
			if (schema[&#039;properties&#039;] ~= nil and schema[&#039;properties&#039;][k] ~= nil and (type(v) ~= &#039;table&#039; or v[1] ~= nil)) then --literal or literal array&lt;br /&gt;
				local def = schema_allOfMerged[&#039;properties&#039;][k]&lt;br /&gt;
				--mw.logObject(def)&lt;br /&gt;
				&lt;br /&gt;
				local label = k&lt;br /&gt;
				if def[&#039;title&#039;] ~= nil then label = def[&#039;title&#039;] end&lt;br /&gt;
				if def[&#039;title*&#039;] ~= nil then -- multilang label with switch&lt;br /&gt;
					label = &amp;quot;{{#switch:{{USERLANGUAGECODE}} |#default=&amp;quot; ..  label&lt;br /&gt;
					for k,v in pairs(def[&#039;title*&#039;]) do label = label .. &amp;quot; |&amp;quot; .. k .. &amp;quot;=&amp;quot; .. v end&lt;br /&gt;
					label = label .. &amp;quot; }}&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				local description = &amp;quot;&amp;quot;&lt;br /&gt;
				if def[&#039;description&#039;] ~= nil then description = def[&#039;description&#039;] end&lt;br /&gt;
				if def[&#039;description*&#039;] ~= nil then -- multilang label with switch&lt;br /&gt;
					description = &amp;quot;{{#switch:{{USERLANGUAGECODE}} |#default=&amp;quot; ..  description&lt;br /&gt;
					for k,v in pairs(def[&#039;description*&#039;]) do description = description .. &amp;quot; |&amp;quot; .. k .. &amp;quot;=&amp;quot; .. v end&lt;br /&gt;
					description = description .. &amp;quot; }}&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				if (p.tableLength(p.defaultArgPath(property_definitions, {k, &#039;defined_in&#039;}, {})) &amp;gt; 0) then description = description .. &amp;quot;&amp;lt;br&amp;gt;Definition: &amp;quot; end&lt;br /&gt;
				for i, c in pairs(p.defaultArgPath(property_definitions, {k, &#039;defined_in&#039;}, {})) do &lt;br /&gt;
					if (i &amp;gt; 1) then description = description .. &amp;quot;, &amp;quot; end&lt;br /&gt;
					description = description .. &amp;quot;[[:&amp;quot; ..c .. &amp;quot;]]&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				if (description ~= &amp;quot;&amp;quot;) then description = &amp;quot;{{#info: &amp;quot; .. description .. &amp;quot;|note }}&amp;quot; end -- smw tooltip&lt;br /&gt;
				label = label .. description&lt;br /&gt;
&lt;br /&gt;
				--res = res .. title &amp;quot;: &amp;quot; .. v&lt;br /&gt;
				local cell = tbl:tag( &#039;tr&#039; )&lt;br /&gt;
									:tag( &#039;th&#039; )&lt;br /&gt;
										:wikitext( label )&lt;br /&gt;
										:done()&lt;br /&gt;
									:tag( &#039;td&#039; )&lt;br /&gt;
				if (type(v) == &#039;table&#039;) then&lt;br /&gt;
					for i,e in pairs(v) do &lt;br /&gt;
						if (type(e) ~= &#039;table&#039;) then &lt;br /&gt;
							local p_type = p.defaultArgPath(context, {k, &#039;@type&#039;}, &#039;@value&#039;)&lt;br /&gt;
							if (p_type == &#039;@id&#039; and p.defaultArgPath(def, {&#039;items&#039;, &#039;type&#039;}, &#039;unknown&#039;) == &#039;string&#039; and def[&#039;eval_template&#039;] == nil) then&lt;br /&gt;
								-- auto-link (OSW-)IDs if no eval_template is present&lt;br /&gt;
								e = string.gsub(e, &amp;quot;Category:&amp;quot;, &amp;quot;:Category:&amp;quot;) -- make sure category links work&lt;br /&gt;
								e = string.gsub(e, &amp;quot;File:&amp;quot;, &amp;quot;:File:&amp;quot;) -- do not embedd images but link to them&lt;br /&gt;
								e = &amp;quot;[[&amp;quot; .. e .. &amp;quot;]]&amp;quot; &lt;br /&gt;
							elseif (p_type == &#039;xsd:date&#039;) then -- formate date with user preferences&lt;br /&gt;
								e = &amp;quot;{{#dateformat:&amp;quot; .. e .. &amp;quot;|ymd}}&amp;quot; &lt;br /&gt;
							elseif (p_type == &#039;xsd:dateTime&#039;) then -- formate time with user preferences&lt;br /&gt;
								local smw_property = p.defaultArgPath(property_definitions, {k, &#039;property&#039;})&lt;br /&gt;
								if (smw_property ~= nil) then e = &amp;quot;{{#ask: [[{{FULLPAGENAME}}]]|?&amp;quot; .. smw_property .. &amp;quot;#LOCL#TO= |format=plain |mainlabel=-}}&amp;quot;&lt;br /&gt;
								else &lt;br /&gt;
									local _, _, date, hours, minutes = string.find(e, &amp;quot;(%S+)[T ](%S+)[:](%S+)[:?]&amp;quot;)&lt;br /&gt;
									e = &amp;quot;{{#dateformat:&amp;quot; .. date .. &amp;quot;|ymd}} &amp;quot; .. hours .. &amp;quot;:&amp;quot; .. minutes .. &amp;quot; (UTC)&amp;quot;&lt;br /&gt;
								end&lt;br /&gt;
							elseif (type(v) == &#039;boolean&#039;) then &lt;br /&gt;
								if (v) then v = &amp;quot;&amp;amp;#x2705;&amp;quot; else v = &amp;quot;&amp;amp;#x274C;&amp;quot; end -- green check mark or red cross&lt;br /&gt;
							elseif ((string.len(e) &amp;gt; 100) and (string.find(e, &amp;quot;{{&amp;quot;) == nil) and (string.find(e, &amp;quot;&amp;lt;/&amp;quot;) == nil)) then &lt;br /&gt;
								e = string.sub(e, 1, 100) .. &amp;quot;...&amp;quot;; -- limit infobox plain text to max 100 chars&lt;br /&gt;
							elseif (debug) then&lt;br /&gt;
								mw.log(&amp;quot;Unformated: &amp;quot; .. k .. &amp;quot; &amp;quot; .. p.defaultArgPath(def, {&#039;items&#039;, &#039;type&#039;}, &#039;unknown&#039;))&lt;br /&gt;
								mw.logObject(def)&lt;br /&gt;
							end&lt;br /&gt;
							cell:wikitext(&amp;quot;\n* &amp;quot; .. e .. &amp;quot;&amp;quot;) &lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					local p_type = p.defaultArgPath(context, {k, &#039;@type&#039;}, &#039;@value&#039;)&lt;br /&gt;
					if (p_type == &#039;@id&#039; and p.defaultArgPath(def, {&#039;type&#039;}, &#039;unknown&#039;) == &#039;string&#039; and def[&#039;eval_template&#039;] == nil) then &lt;br /&gt;
						-- auto-link (OSW-)IDs if no eval_template is present&lt;br /&gt;
						v = string.gsub(v, &amp;quot;Category:&amp;quot;, &amp;quot;:Category:&amp;quot;) -- make sure category links work&lt;br /&gt;
						v = string.gsub(v, &amp;quot;File:&amp;quot;, &amp;quot;:File:&amp;quot;) -- do not embedd images but link to them&lt;br /&gt;
						v = &amp;quot;[[&amp;quot; .. v .. &amp;quot;]]&amp;quot; &lt;br /&gt;
					elseif (p_type == &#039;xsd:date&#039;) then -- formate date &amp;amp; time with user preferences&lt;br /&gt;
						v = &amp;quot;{{#dateformat:&amp;quot; .. v .. &amp;quot;|ymd}}&amp;quot;&lt;br /&gt;
					elseif (p_type == &#039;xsd:dateTime&#039;) then -- formate time with user preferences&lt;br /&gt;
						local smw_property = p.defaultArgPath(property_definitions, {k, &#039;property&#039;})&lt;br /&gt;
						if (smw_property ~= nil) then v = &amp;quot;{{#ask: [[{{FULLPAGENAME}}]]|?&amp;quot; .. smw_property .. &amp;quot;#LOCL#TO= |format=plain |mainlabel=-}}&amp;quot;&lt;br /&gt;
						else &lt;br /&gt;
							local _, _, date, hours, minutes = string.find(v, &amp;quot;(%S+)[T ](%S+)[:](%S+)[:?]&amp;quot;)&lt;br /&gt;
							v = &amp;quot;{{#dateformat:&amp;quot; .. date .. &amp;quot;|ymd}} &amp;quot; .. hours .. &amp;quot;:&amp;quot; .. minutes .. &amp;quot; (UTC)&amp;quot;&lt;br /&gt;
						end&lt;br /&gt;
					elseif (type(v) == &#039;boolean&#039;) then &lt;br /&gt;
						if (v) then v = &amp;quot;&amp;amp;#x2705;&amp;quot; else v = &amp;quot;&amp;amp;#x274C;&amp;quot; end -- green check mark or red cross&lt;br /&gt;
					elseif ((string.len(v) &amp;gt; 100) and (string.find(v, &amp;quot;{{&amp;quot;) == nil) and (string.find(v, &amp;quot;&amp;lt;/&amp;quot;) == nil)) then&lt;br /&gt;
						v = string.sub(v, 1, 100) .. &amp;quot;...&amp;quot;; -- limit infobox plain text to max 100 chars&lt;br /&gt;
					elseif (debug) then&lt;br /&gt;
						mw.log(&amp;quot;Unformated: &amp;quot; .. k .. &amp;quot; &amp;quot; .. p.defaultArgPath(def, {&#039;type&#039;}, &#039;unknown&#039;))&lt;br /&gt;
						mw.logObject(def)&lt;br /&gt;
					end&lt;br /&gt;
					cell:wikitext(&amp;quot;\n&amp;quot; .. v .. &amp;quot;&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end	&lt;br /&gt;
	res = res .. tostring( tbl )&lt;br /&gt;
	--mw.logObject(res)&lt;br /&gt;
	&lt;br /&gt;
	return {wikitext=res}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- test&lt;br /&gt;
-- mw.logObject(p.getCategories({jsonschema={allOf={[&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/Category:Test?action=raw&amp;amp;slot=jsonschema&amp;quot;}}, includeNamespace=true}))&lt;br /&gt;
-- mw.logObject(p.getCategories({jsonschema={allOf={{[&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/Category:Test?action=raw&amp;amp;slot=jsonschema&amp;quot;}, {[&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/Category:Test2?action=raw&amp;amp;slot=jsonschema&amp;quot;}}}}))&lt;br /&gt;
function p.getCategories(args)&lt;br /&gt;
	local jsonschema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local includeNamespace = p.defaultArg(args.includeNamespace, false)&lt;br /&gt;
	&lt;br /&gt;
	local categories = {}&lt;br /&gt;
		local allOf = jsonschema[p.keys.allOf]&lt;br /&gt;
		if (allOf ~= nil) then&lt;br /&gt;
			--properties[&#039;@category&#039;] = {}&lt;br /&gt;
			for k, entry in pairs(allOf) do&lt;br /&gt;
				if type(entry) == &#039;table&#039; then -- &amp;quot;allOf&amp;quot;: [{&amp;quot;$ref&amp;quot;: &amp;quot;/wiki/Category:Test?action=raw&amp;quot;}]&lt;br /&gt;
					for p, v in pairs(entry) do&lt;br /&gt;
						if (p == &#039;$ref&#039;) then&lt;br /&gt;
							for category in v:gmatch(&amp;quot;Category:([^?]+)&amp;quot;) do -- e.g. &amp;quot;/wiki/Category:Test?action=raw&amp;quot;&lt;br /&gt;
								if (includeNamespace) then category = &amp;quot;Category:&amp;quot; .. category end&lt;br /&gt;
							    table.insert(categories, category)&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else -- &amp;quot;allOf&amp;quot;: {&amp;quot;$ref&amp;quot;: &amp;quot;/wiki/Category:Test?action=raw&amp;quot;}&lt;br /&gt;
					if (k == &#039;$ref&#039;) then&lt;br /&gt;
						for category in entry:gmatch(&amp;quot;Category:([^?]+)&amp;quot;) do -- e.g. &amp;quot;/wiki/Category:Test?action=raw&amp;quot;&lt;br /&gt;
							if (includeNamespace) then category = &amp;quot;Category:&amp;quot; .. category end&lt;br /&gt;
							table.insert(categories, category)&lt;br /&gt;
						end&lt;br /&gt;
					end	&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
		&lt;br /&gt;
	return {categories=categories}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--sets a list of categories on the page&lt;br /&gt;
--test: mw.logObject(p.setCategories({categories={&amp;quot;Cat1&amp;quot;, &amp;quot;Category:Cat2&amp;quot;}}))&lt;br /&gt;
function p.setCategories(args)&lt;br /&gt;
	local categories = p.defaultArg(args.categories, {})&lt;br /&gt;
	local sortkey = p.defaultArg(args.sortkey, &amp;quot;&amp;quot;)&lt;br /&gt;
	if (sortkey ~= &amp;quot;&amp;quot;) then sortkey = &amp;quot;|&amp;quot; .. sortkey end&lt;br /&gt;
	if (type(categories) ~= &#039;table&#039;) then categories = {categories} end&lt;br /&gt;
	local res = &amp;quot;&amp;quot;&lt;br /&gt;
	for k, entry in pairs(categories) do&lt;br /&gt;
		res = res .. &amp;quot;[[Category:&amp;quot; .. string.gsub(entry, &amp;quot;Category:&amp;quot;, &amp;quot;&amp;quot;) .. sortkey ..&amp;quot;]]&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return {wikitext=res}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ test&lt;br /&gt;
category = &amp;quot;Category:Entity&amp;quot;&lt;br /&gt;
jsonschema = p.expandJsonRef({json=p.loadJson({title=category, slot=&amp;quot;jsonschema&amp;quot;}).json}).json&lt;br /&gt;
mw.logObject(p.buildContext({jsonschema=jsonschema, debug=true}))&lt;br /&gt;
mw.log(mw.text.jsonEncode(p.buildContext({jsonschema=jsonschema, debug=false}).context))&lt;br /&gt;
or&lt;br /&gt;
jsonschema = {&lt;br /&gt;
	[&amp;quot;@context&amp;quot;]={test=&amp;quot;level 0&amp;quot;}, &lt;br /&gt;
	properties={&lt;br /&gt;
		test={&lt;br /&gt;
			type=&amp;quot;object&amp;quot;,&lt;br /&gt;
			[&amp;quot;@context&amp;quot;]={test1=&amp;quot;level 1&amp;quot;}, &lt;br /&gt;
			properties= {&lt;br /&gt;
				test= {&lt;br /&gt;
					type=&amp;quot;array&amp;quot;,&lt;br /&gt;
					items= {&lt;br /&gt;
						type=&amp;quot;object&amp;quot;,&lt;br /&gt;
						[&amp;quot;@context&amp;quot;]={test2=&amp;quot;level 2&amp;quot;}&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
mw.logObject(p.buildContext({jsonschema=jsonschema, debug=true}))&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- constructs a property specific local jsonld context&lt;br /&gt;
function p.buildContext(args)&lt;br /&gt;
	local schema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	--mw.logObject(schema)&lt;br /&gt;
	local context = p.defaultArg(args.context, schema[p.keys.context])&lt;br /&gt;
	local result = p.defaultArg(args.result, {})&lt;br /&gt;
	if (context ~= nil) then&lt;br /&gt;
		for k,v in pairs(context) do&lt;br /&gt;
			if type(k) == &#039;number&#039; and type(v) == &#039;string&#039; then&lt;br /&gt;
				--table.insert(result, v) --skip context imports&lt;br /&gt;
			elseif (type(v) == &#039;table&#039; and v[1] ~= nil) then --custom addtional mappings, e. g. &amp;quot;type*&amp;quot;: [&amp;quot;Property:HasType&amp;quot;]&lt;br /&gt;
				result[k] = v&lt;br /&gt;
			elseif (type(v) == &#039;table&#039; and v[&#039;@id&#039;] == nil and v[&#039;@reverse&#039;] == nil) then --subcontext&lt;br /&gt;
				p.tableMerge(result, p.buildContext({context=v}).context)&lt;br /&gt;
			else &lt;br /&gt;
				result[k] = v	&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local properties = p.defaultArg(schema.properties, {})&lt;br /&gt;
&lt;br /&gt;
	-- build property context&lt;br /&gt;
	for k,v in pairs(properties) do&lt;br /&gt;
		local subcontext = nil&lt;br /&gt;
		if (p.defaultArgPath(properties, {k, &#039;type&#039;}) == &#039;object&#039;) then&lt;br /&gt;
			--mw.logObject(properties[k])&lt;br /&gt;
			subcontext = p.buildContext({jsonschema=properties[k]}).context&lt;br /&gt;
		elseif (p.defaultArgPath(properties, {k, &#039;items&#039;, &#039;type&#039;}) == &#039;object&#039;) then &lt;br /&gt;
			--mw.logObject(properties[k][&#039;items&#039;])&lt;br /&gt;
			subcontext = p.buildContext({jsonschema=properties[k][&#039;items&#039;]}).context&lt;br /&gt;
		end&lt;br /&gt;
		if (subcontext ~= nil and p.tableLength(subcontext) &amp;gt; 0) then&lt;br /&gt;
			if (result[k] == nil) then result[k] = {} end&lt;br /&gt;
			if (type(result[k]) == &#039;string&#039;) then result[k] = {[&amp;quot;@id&amp;quot;]=result[k]} end&lt;br /&gt;
			if (result[k][p.keys.context] == nil) then result[k][p.keys.context] = {} end&lt;br /&gt;
			result[k][p.keys.context] = p.tableMerge(result[k][p.keys.context], subcontext)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return {context=result}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--maps jsondata values to semantic properties by using the @context attribute within the schema&lt;br /&gt;
--test: mw.logObject(p.getSemanticProperties({jsonschema={[&amp;quot;@context&amp;quot;]={test=&amp;quot;Property:schema:TestProperty&amp;quot;, myObjectProperty={[&amp;quot;@id&amp;quot;]= &amp;quot;Property:MyObjectProperty&amp;quot;, [&amp;quot;@type&amp;quot;]= &amp;quot;@id&amp;quot;}}}, jsondata={test=&amp;quot;TestValue&amp;quot;, myObjectProperty=&amp;quot;123&amp;quot;}, debug=true}))&lt;br /&gt;
--test: mw.logObject(p.getSemanticProperties({jsonschema={[&amp;quot;@context&amp;quot;]={&amp;quot;some uri&amp;quot;,{test=&amp;quot;Property:TestProperty&amp;quot;, myObjectProperty={[&amp;quot;@id&amp;quot;]= &amp;quot;Property:MyObjectProperty&amp;quot;, [&amp;quot;@type&amp;quot;]= &amp;quot;@id&amp;quot;}}}}, jsondata={test=&amp;quot;TestValue&amp;quot;, myObjectProperty=&amp;quot;123&amp;quot;}, debug=true}))&lt;br /&gt;
--[[&lt;br /&gt;
mw.logObject(p.getSemanticProperties({jsonschema={[&amp;quot;@context&amp;quot;]={test=&amp;quot;Property:TestProperty&amp;quot;, subobject=&amp;quot;Property:HasSubobject&amp;quot;, myObjectProperty={[&amp;quot;@id&amp;quot;]= &amp;quot;Property:MyObjectProperty&amp;quot;, [&amp;quot;@type&amp;quot;]= &amp;quot;@id&amp;quot;}}}, jsondata={&lt;br /&gt;
test=&amp;quot;TestValue&amp;quot;, myObjectProperty=&amp;quot;123&amp;quot;, subobject={uuid=&amp;quot;123-123-123&amp;quot;, test=&amp;quot;TestValue2&amp;quot;}&lt;br /&gt;
}, debug=true}))&lt;br /&gt;
&lt;br /&gt;
mw.logObject(p.getSemanticProperties({jsonschema=p.loadJson({title=&amp;quot;Category:OSW80e240a2e17d4ae5adfe6419051aa0bb&amp;quot;, slot=&amp;quot;jsonschema&amp;quot;}).json, p.loadJson({title=&amp;quot;Item:OSWa4da6664aeac466a86b09e6b32a1cb41&amp;quot;, slot=&amp;quot;jsonsdata&amp;quot;}).json, debug=true}))&lt;br /&gt;
&lt;br /&gt;
category = &amp;quot;Category:Hardware&amp;quot;&lt;br /&gt;
page = &amp;quot;Item:OSW7d7193567ea14e4e89b74de88983b718&amp;quot;&lt;br /&gt;
category2 = &amp;quot;Category:OSW80e240a2e17d4ae5adfe6419051aa0bb&amp;quot;&lt;br /&gt;
page2 = &amp;quot;Item:OSWa4da6664aeac466a86b09e6b32a1cb41&amp;quot;&lt;br /&gt;
jsonschema =p.walkJsonSchema({jsonschema=p.loadJson({title=category, slot=&amp;quot;jsonschema&amp;quot;}).json, debug=true}).jsonschema&lt;br /&gt;
mw.logObject(p.getSemanticProperties({&lt;br /&gt;
	jsonschema=jsonschema,&lt;br /&gt;
	jsondata=p.expandEmbeddedTemplates({jsonschema=jsonschema, jsondata=p.loadJson({title=page, slot=&amp;quot;jsondata&amp;quot;}).json}).res,&lt;br /&gt;
	debug=true&lt;br /&gt;
}).properties)&lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
function p.getSemanticProperties(args)&lt;br /&gt;
	local jsondata = p.defaultArg(args.jsondata, {})&lt;br /&gt;
	local schema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local subschema = p.defaultArg(args.subschema, schema)&lt;br /&gt;
	local parent_schema_property = p.defaultArg(args.parent_schema_property, {}) -- ToDo: Not used except in getSemanticQuery =&amp;gt; remove&lt;br /&gt;
	local store = p.defaultArg(args.store, false)&lt;br /&gt;
	local root = p.defaultArg(args.root, true)&lt;br /&gt;
	local properties = p.defaultArg(args.properties, {}) --semantic properties to store, dict key=property_name, value=array of string values&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
	--if (debug) then mw.logObject(&amp;quot;Call getSemanticProperties with args &amp;quot; .. mw.dumpObject( args ) .. &amp;quot;\n&amp;lt;br&amp;gt;&amp;quot;) end&lt;br /&gt;
	&lt;br /&gt;
	local subjectId = mw.title.getCurrentTitle().fullText&lt;br /&gt;
	local subobjectId = nil&lt;br /&gt;
	if (root == false and jsondata[&#039;uuid&#039;] ~= nil) then &lt;br /&gt;
		subobjectId = &amp;quot;OSW&amp;quot; .. string.gsub(jsondata[&#039;uuid&#039;], &amp;quot;-&amp;quot;, &amp;quot;&amp;quot;) &lt;br /&gt;
		subjectId = subjectId .. &#039;#&#039; .. subobjectId&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local property_data = {}&lt;br /&gt;
	local context = p.defaultArg(args.context, p.buildContext({jsonschema=schema}).context)&lt;br /&gt;
	local error = &amp;quot;&amp;quot;&lt;br /&gt;
	if (debug) then mw.logObject(context) end&lt;br /&gt;
	if schema ~= nil and context ~= nil then&lt;br /&gt;
		local schema_properties = p.defaultArg(subschema.properties, {})&lt;br /&gt;
		if (debug and root) then&lt;br /&gt;
			for k,v in pairs(context) do&lt;br /&gt;
				if type(k) == &#039;number&#039; then mw.logObject(&amp;quot;imports &amp;quot; .. v)&lt;br /&gt;
				elseif type(v) == &#039;table&#039; and v[&amp;quot;@id&amp;quot;] ~= nil then mw.logObject(&amp;quot;&amp;quot; .. k .. &amp;quot; maps to &amp;quot; .. v[&amp;quot;@id&amp;quot;]) &lt;br /&gt;
				else mw.logObject(&amp;quot;&amp;quot; .. k .. &amp;quot; maps to &amp;quot; .. mw.dumpObject(v)) end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k,v in pairs(jsondata) do&lt;br /&gt;
			local property_names = {}&lt;br /&gt;
			local subobject_properties = {} -- reverse properties to store in the subobject&lt;br /&gt;
			local mapping_found = false&lt;br /&gt;
			local property_definitions = {} -- list of objects {id=..., reverse=...}&lt;br /&gt;
&lt;br /&gt;
			for term, def in pairs(context) do&lt;br /&gt;
				local term_parts = p.splitString(term, &amp;quot;*&amp;quot;)&lt;br /&gt;
				if (term_parts[1] == k) then --custom additional mapping term*(*...): &amp;quot;Property:...&amp;quot;&lt;br /&gt;
					if type(def) == &#039;table&#039; then &lt;br /&gt;
						-- note: json-ld allows only @id OR @reverse&lt;br /&gt;
						if (def[&amp;quot;@id&amp;quot;] ~= nil) then table.insert(property_definitions, {id=def[&amp;quot;@id&amp;quot;], reverse=false}) end&lt;br /&gt;
						if (def[&amp;quot;@reverse&amp;quot;] ~= nil) then table.insert(property_definitions, {id=def[&amp;quot;@reverse&amp;quot;], reverse=true}) end&lt;br /&gt;
					else table.insert(property_definitions, {id=def}) end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if (debug) then mw.logObject(property_definitions) end&lt;br /&gt;
			for i,e in ipairs(property_definitions) do &lt;br /&gt;
				local id = e[&amp;quot;id&amp;quot;]&lt;br /&gt;
				local property_definition = p.splitString(id, &#039;:&#039;)&lt;br /&gt;
				if property_definition[1] == p.keys.property_ns_prefix then&lt;br /&gt;
					mapping_found = true&lt;br /&gt;
					property_name = string.gsub(id, p.keys.property_ns_prefix .. &amp;quot;:&amp;quot;, &amp;quot;&amp;quot;) -- also allow prefix properties like: Property:schema:url&lt;br /&gt;
					if (e[&amp;quot;reverse&amp;quot;]) then -- reverse properties are handled in the respective subobject&lt;br /&gt;
						if (subobject_properties[property_name] == nil) then subobject_properties[property_name] = {} end --initialize empty list&lt;br /&gt;
						table.insert(subobject_properties[property_name], subjectId) -- add triple subobject -property-&amp;gt; subject&lt;br /&gt;
					else table.insert(property_names, property_name) end&lt;br /&gt;
					local schema_property = p.defaultArg(schema_properties[k], {})&lt;br /&gt;
					local schema_type = p.defaultArg(schema_property.type, nil) --todo: also load smw property type on demand&lt;br /&gt;
					property_data[k] = {schema_type=schema_type, schema_data=schema_property, property=property_name, value=v, reverse=e[&amp;quot;reverse&amp;quot;]}&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			for i, property_name in ipairs(property_names) do&lt;br /&gt;
				if (properties[property_name] == nil) then properties[property_name] = {} end --initialize empty list&lt;br /&gt;
			end&lt;br /&gt;
			if type(v) == &#039;table&#039; then &lt;br /&gt;
				--if (debug) then mw.logObject(&amp;quot;prop &amp;quot; .. k .. &amp;quot; = &amp;quot; .. mw.dumpObject(v)) end&lt;br /&gt;
				if (mapping_found) then&lt;br /&gt;
					local subcontext = p.copy(p.defaultArgPath(context, {k, p.keys.context}, {})) --deepcopy, see also https://phabricator.wikimedia.org/T269990&lt;br /&gt;
					context = p.tableMerge(context, subcontext) -- pull up nested context&lt;br /&gt;
					local values = {}&lt;br /&gt;
					if (v[1] == nil) then --key value array = object/dict&lt;br /&gt;
						local subproperties_res = p.getSemanticProperties({jsonschema=schema, jsondata=v, properties=p.copy(subobject_properties), store=true, root=false, debug=debug, context=context, subschema=schema_properties[k], parent_schema_property=property_data[k]})&lt;br /&gt;
						local id = subproperties_res.id --subobject_id&lt;br /&gt;
						if (id ~= nil) then &lt;br /&gt;
							id = mw.title.getCurrentTitle().fullText .. &#039;#&#039; .. id&lt;br /&gt;
							table.insert(values, id) &lt;br /&gt;
						end&lt;br /&gt;
						properties = p.processStatement({subject=properties, statement=subproperties_res.properties, debug=debug}).subject&lt;br /&gt;
					else --list array&lt;br /&gt;
						for i, e in pairs(v) do&lt;br /&gt;
							if (type(e) == &#039;table&#039;) then &lt;br /&gt;
								local subproperties_res = p.getSemanticProperties({jsonschema=schema, jsondata=e, properties=p.copy(subobject_properties), store=true, root=false, debug=debug, context=context, subschema=schema_properties[k], parent_schema_property=property_data[k]})&lt;br /&gt;
								local id = subproperties_res.id --subobject_id&lt;br /&gt;
								if (id ~= nil) then &lt;br /&gt;
									id = mw.title.getCurrentTitle().fullText .. &#039;#&#039; .. id&lt;br /&gt;
									table.insert(values, id) &lt;br /&gt;
								end&lt;br /&gt;
								properties = p.processStatement({subject=properties, statement=subproperties_res.properties, debug=debug}).subject&lt;br /&gt;
							else values = v end --plain strings&lt;br /&gt;
						end&lt;br /&gt;
					end &lt;br /&gt;
					for pi, property_name in ipairs(property_names) do&lt;br /&gt;
						for i,value in pairs(values) do table.insert(properties[property_name], value) end&lt;br /&gt;
						if (debug) then mw.logObject(&amp;quot;set &amp;quot; .. property_name .. &amp;quot; = &amp;quot; .. mw.dumpObject(values)) end&lt;br /&gt;
					end&lt;br /&gt;
				else if (debug) then mw.logObject(&amp;quot;not mapped: &amp;quot; .. k .. &amp;quot; = &amp;quot; .. mw.dumpObject(v)) end &lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				if (mapping_found) then &lt;br /&gt;
					for pi, property_name in ipairs(property_names) do&lt;br /&gt;
						table.insert(properties[property_name], v)&lt;br /&gt;
						if (debug) then mw.logObject(&amp;quot;set &amp;quot; .. property_name .. &amp;quot; = &amp;quot; .. mw.dumpObject(v)) end&lt;br /&gt;
					end&lt;br /&gt;
				else &lt;br /&gt;
					if (debug) then mw.logObject(&amp;quot;not mapped: &amp;quot; .. k .. &amp;quot; = &amp;quot; .. mw.dumpObject(v)) end &lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local store_res = nil&lt;br /&gt;
	if (store) then &lt;br /&gt;
		properties[&#039;HasOswId&#039;] = subjectId&lt;br /&gt;
		if (root) then &lt;br /&gt;
			if (debug) then mw.logObject(&amp;quot;Store page properties&amp;quot;) end&lt;br /&gt;
			store_res = mw.smw.set( properties ) --store as semantic properties&lt;br /&gt;
		else&lt;br /&gt;
			properties[&#039;@category&#039;] = {}&lt;br /&gt;
			p.tableMerge(properties[&#039;@category&#039;], jsondata[p.keys.category]) -- from json property &#039;type&#039;&lt;br /&gt;
			p.tableMerge(properties[&#039;@category&#039;], properties[p.keys.category_pseudoproperty]) -- from json-ld context &#039;Property:Category&#039;&lt;br /&gt;
			properties[p.keys.category_pseudoproperty] = nil -- delete pseudo property&lt;br /&gt;
			if (jsondata[p.keys.name] ~= nil) then properties[&#039;Display title of&#039;] = jsondata[p.keys.name] &lt;br /&gt;
			elseif (jsondata[p.keys.label] ~= nil and jsondata[p.keys.label][1] ~= nil) then properties[&#039;Display title of&#039;] = p.splitString(jsondata[p.keys.label][1], &#039;@&#039;)[1] &lt;br /&gt;
			else properties[&#039;Display title of&#039;] = p.defaultArg(subschema[&#039;title&#039;], &amp;quot;&amp;quot;) end&lt;br /&gt;
			p.setNormalizedLabel(properties) --build normalized multilang label&lt;br /&gt;
			if (p.tableLength(properties) &amp;gt; 0) then&lt;br /&gt;
				store_res = mw.smw.subobject( properties, subobjectId )	--store as subobject&lt;br /&gt;
				if (debug) then mw.logObject(&amp;quot;Store subobject with id &amp;quot; .. (subobjectId or &amp;quot;&amp;lt;random&amp;gt;&amp;quot;)) end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (debug) then mw.logObject(properties) end&lt;br /&gt;
	if (store_res ~= nil) then &lt;br /&gt;
		if (not store_res and store_res.error ~= nil) then error = error .. store_res.error end&lt;br /&gt;
	end&lt;br /&gt;
	if (debug) then mw.logObject(error) end&lt;br /&gt;
	return {properties=properties, definitions=property_data, id=subobjectId, context=context, error=error}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.processStatement(args)&lt;br /&gt;
	local statement = p.defaultArg(args.statement)&lt;br /&gt;
	local subject = p.defaultArg(args.subject)&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
&lt;br /&gt;
	-- handle &amp;quot;approved&amp;quot; statements&lt;br /&gt;
	if (statement[&amp;quot;HasSubject&amp;quot;] == nil or statement[&amp;quot;HasSubject&amp;quot;][1] == nil or statement[&amp;quot;HasSubject&amp;quot;][1] == &amp;quot;&amp;quot;) then --implicit subject&lt;br /&gt;
		if (statement[&amp;quot;HasProperty&amp;quot;] ~= nil and statement[&amp;quot;HasProperty&amp;quot;][1] ~= nil and statement[&amp;quot;HasProperty&amp;quot;][1] ~= &amp;quot;&amp;quot; and statement[&amp;quot;HasObject&amp;quot;] ~= nil) then&lt;br /&gt;
			local property = string.gsub(statement[&amp;quot;HasProperty&amp;quot;][1], p.keys.property_ns_prefix .. &amp;quot;:&amp;quot;, &amp;quot;&amp;quot;) -- also allow prefix properties like: Property:schema:url&lt;br /&gt;
			if (debug) then&lt;br /&gt;
				mw.log(&amp;quot;Set property &amp;quot; .. property .. &amp;quot; from statement to &amp;quot;)&lt;br /&gt;
				mw.logObject(statement[&amp;quot;HasObject&amp;quot;])&lt;br /&gt;
			end&lt;br /&gt;
			if (subject[property] == nil) then subject[property] = {} end&lt;br /&gt;
			for k, v in pairs(statement[&amp;quot;HasObject&amp;quot;]) do table.insert(subject[property], v) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return {subject=subject}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- build a semantic query based on provided properties and their schema definition&lt;br /&gt;
--[[ test: &lt;br /&gt;
mw.logObject(p.getSemanticQuery({&lt;br /&gt;
	jsonschema={&lt;br /&gt;
		[&amp;quot;@context&amp;quot;]={&lt;br /&gt;
			test=&amp;quot;Property:TestProperty&amp;quot;,&lt;br /&gt;
			number_max=&amp;quot;Property:HasNumber&amp;quot;,&lt;br /&gt;
			date_min=&amp;quot;Property:HasDate&amp;quot;&lt;br /&gt;
		}, &lt;br /&gt;
		properties={&lt;br /&gt;
			test={title=&amp;quot;Test&amp;quot;, type=&amp;quot;string&amp;quot;},&lt;br /&gt;
			number_max={title=&amp;quot;Number&amp;quot;, type=&amp;quot;string&amp;quot;, format=&amp;quot;number&amp;quot;, options={role={query={filter=&amp;quot;max&amp;quot;}}}},&lt;br /&gt;
			date_min={title=&amp;quot;Date&amp;quot;, type=&amp;quot;string&amp;quot;, format=&amp;quot;date&amp;quot;, options={role={query={filter=&amp;quot;min&amp;quot;}}}},&lt;br /&gt;
		}&lt;br /&gt;
	}, &lt;br /&gt;
	jsondata={test=&amp;quot;TestValue&amp;quot;, number_max=5, date_min=&amp;quot;01.01.2023&amp;quot;}&lt;br /&gt;
}))&lt;br /&gt;
--]]&lt;br /&gt;
function p.getSemanticQuery(args)&lt;br /&gt;
	--local jsondata = p.defaultArg(args.jsondata, {})&lt;br /&gt;
	--local schema = p.defaultArg(args.jsonschema, {})&lt;br /&gt;
	local res = &amp;quot;&amp;quot;&lt;br /&gt;
	local where = &amp;quot;&amp;quot;&lt;br /&gt;
	local select = &amp;quot;&amp;quot;&lt;br /&gt;
	local semantic_properties = p.getSemanticProperties(args)&lt;br /&gt;
	--mw.logObject(semantic_properties)&lt;br /&gt;
	for k,def in pairs(semantic_properties.definitions) do&lt;br /&gt;
		-- see also: https://www.semantic-mediawiki.org/wiki/Help:Search_operators&lt;br /&gt;
		local filter = p.defaultArgPath(def.schema_data, {&#039;options&#039;, &#039;role&#039;, &#039;query&#039;, &#039;filter&#039;}, &#039;eq&#039;)&lt;br /&gt;
		local value = def.value&lt;br /&gt;
		if def.schema_data.type == &#039;string&#039; and (def.schema_data.format == &#039;number&#039; or def.schema_data.format == &#039;date&#039;) then &lt;br /&gt;
			if (filter == &#039;min&#039;) then value = &amp;quot;&amp;lt;&amp;quot; .. value&lt;br /&gt;
			elseif (filter == &#039;max&#039;) then value = &amp;quot;&amp;gt;&amp;quot; .. value&lt;br /&gt;
			else value = value end --exact match&lt;br /&gt;
		elseif def.schema_data.type == &#039;string&#039; then&lt;br /&gt;
			value = &amp;quot;~*&amp;quot; .. value .. &amp;quot;*&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		where = where .. &amp;quot;\n[[&amp;quot;.. def.property .. &amp;quot;::&amp;quot; .. value .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		select = select .. &amp;quot;\n|?&amp;quot; .. def.property&lt;br /&gt;
		if (def.schema_data.title ~= nil) then select = select .. &amp;quot;=&amp;quot; .. def.schema_data.title end&lt;br /&gt;
	end&lt;br /&gt;
	if (where ~= &amp;quot;&amp;quot;) then res = &amp;quot;{{#ask:&amp;quot; .. res .. where .. select .. &amp;quot;}}&amp;quot; end&lt;br /&gt;
	return {wikitext=res}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- HELPERS&lt;br /&gt;
&lt;br /&gt;
-- expands all $ref&lt;br /&gt;
--test: mw.logObject(p.expandJsonRef({json={items={test=&amp;quot;value&amp;quot;, [&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/JsonSchema:Label?action=raw&amp;quot;}}}).json)&lt;br /&gt;
--test: mw.logObject(p.expandJsonRef({json={[&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/Category:Item?action=raw&amp;amp;slot=jsonschema&amp;quot;}}).json)&lt;br /&gt;
--test: mw.logObject(p.expandJsonRef({json={[&amp;quot;$ref&amp;quot;]=&amp;quot;/wiki/JsonSchema:Statement?action=raw&amp;quot;}}).json)&lt;br /&gt;
function p.expandJsonRef(args)&lt;br /&gt;
	local json = p.defaultArg(args.json, {})&lt;br /&gt;
	local debug = p.defaultArg(args.debug, false)&lt;br /&gt;
	local refs = {}&lt;br /&gt;
    for k,v in pairs(json) do&lt;br /&gt;
    	if (k == &amp;quot;$ref&amp;quot;) then&lt;br /&gt;
    		-- e. g. &amp;quot;/wiki/JsonSchema:Label?action=raw&amp;quot; or &amp;quot;/wiki/Category:Entity?action=raw&amp;amp;slot=jsonschema&amp;quot;&lt;br /&gt;
    		if string.find(v, &amp;quot;#&amp;quot;) then&lt;br /&gt;
    			if (debug) then mw.logObject(&amp;quot;Skip relative reference&amp;quot;) end&lt;br /&gt;
    		else&lt;br /&gt;
	    		local uri = mw.uri.new(v)&lt;br /&gt;
	    		local ref_title = mw.text.split(uri.path, &amp;quot;wiki/&amp;quot;, true)[2]&lt;br /&gt;
	    		local ref_slot = uri.query[&amp;quot;slot&amp;quot;]&lt;br /&gt;
	    		if (debug) then &lt;br /&gt;
		    		if (ref_slot ~= nil) then mw.logObject(&amp;quot;Ref found with title &amp;quot; .. ref_title .. &amp;quot; and slot &amp;quot; .. ref_slot)&lt;br /&gt;
		    		else mw.logObject(&amp;quot;Ref found with title &amp;quot; .. ref_title) end&lt;br /&gt;
	    		end&lt;br /&gt;
	    		local ref_json = p.loadJson({title=ref_title, slot=ref_slot}).json&lt;br /&gt;
	    		refs[v] = ref_json&lt;br /&gt;
	    		json[k] = nil&lt;br /&gt;
    		end&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
	--mw.logObject(refs)&lt;br /&gt;
	for k,v in pairs(refs) do&lt;br /&gt;
		json = p.tableMerge(v, json)&lt;br /&gt;
	end&lt;br /&gt;
    for k,v in pairs(json) do&lt;br /&gt;
    	if type(v) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            json[k] = p.expandJsonRef({json=v}).json&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local result = p.copy(json)&lt;br /&gt;
    for k,v in pairs(json) do&lt;br /&gt;
    	if (k == &amp;quot;allOf&amp;quot;) then&lt;br /&gt;
            if (type(v) == &amp;quot;table&amp;quot; and v[1] == nil) then v = {v} end -- ensure array&lt;br /&gt;
            for i,s in pairs(v) do &lt;br /&gt;
            	result = p.tableMerge(s, result)&lt;br /&gt;
            	if (debug) then mw.log(&amp;quot;merge allOf with title &amp;quot; .. s[&amp;quot;title&amp;quot;]) end&lt;br /&gt;
            end&lt;br /&gt;
            result[k] = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return {json=result}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.defaultArg(arg, default)&lt;br /&gt;
	if (arg == nil) then &lt;br /&gt;
		return default&lt;br /&gt;
	else&lt;br /&gt;
		return arg&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- returns the value of a table (dict) path or default, if the path is not defined&lt;br /&gt;
-- test: mw.logObject(p.defaultArgPath({some={defined={path=&amp;quot;value&amp;quot;}}}, {&amp;quot;some&amp;quot;, &amp;quot;defined&amp;quot;, &amp;quot;path&amp;quot;}, &amp;quot;default_value&amp;quot;))&lt;br /&gt;
-- test: mw.logObject(p.defaultArgPath({some={defined={path=&amp;quot;value&amp;quot;}}}, {&amp;quot;some&amp;quot;, &amp;quot;undefined&amp;quot;, &amp;quot;path&amp;quot;}, &amp;quot;default_value&amp;quot;))&lt;br /&gt;
function p.defaultArgPath(arg, path, default)&lt;br /&gt;
	if (arg == nil) then &lt;br /&gt;
		return default&lt;br /&gt;
	elseif (path == nil) then&lt;br /&gt;
		return arg&lt;br /&gt;
	else&lt;br /&gt;
		key = table.remove(path,1)&lt;br /&gt;
		if (key == nil) then return arg end  --end of path&lt;br /&gt;
		return p.defaultArgPath(arg[key], path, default)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitString(inputstr, sep)&lt;br /&gt;
	&lt;br /&gt;
        if sep == nil then&lt;br /&gt;
                sep = &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        local t={}&lt;br /&gt;
        for str in string.gmatch(inputstr, &amp;quot;([^&amp;quot;..sep..&amp;quot;]+)&amp;quot;) do&lt;br /&gt;
                table.insert(t, str)&lt;br /&gt;
        end&lt;br /&gt;
        return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--dumps a table to a string (replaced by mw.dumpObject())&lt;br /&gt;
function p.dump(o)&lt;br /&gt;
   return mw.dumpObject(o)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--converts a literal to an table&lt;br /&gt;
function p.tablefy(o)&lt;br /&gt;
	if (o == nil) then o = {} end&lt;br /&gt;
	if (type(o) ~= &#039;table&#039;) then o = {o} end&lt;br /&gt;
	return o&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--true if the value is contained in the array (flat arrays only)&lt;br /&gt;
function p.tableContains (tab, val)&lt;br /&gt;
    for index, value in ipairs(tab) do&lt;br /&gt;
        if value == val then&lt;br /&gt;
            return true&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--get the size of a table&lt;br /&gt;
function p.tableLength(t)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(t) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--check if a variable is nil or an empty string or table&lt;br /&gt;
function p.nilOrEmpty(o)&lt;br /&gt;
	if (o == nil) then return true&lt;br /&gt;
	elseif (type(o) == &#039;string&#039; and o == &amp;quot;&amp;quot;) then return true&lt;br /&gt;
	elseif (type(o) == &#039;table&#039; and p.tableLength(o) == 0) then return true&lt;br /&gt;
	else return false &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- merges t2 to t1&lt;br /&gt;
--test: mw.logObject(p.tableMerge({&amp;quot;string&amp;quot;, test1=&amp;quot;test1&amp;quot;, subtable1={&amp;quot;test&amp;quot;}}, {&amp;quot;string2&amp;quot;, test1=&amp;quot;test2&amp;quot;, test3=&amp;quot;test4&amp;quot;}))&lt;br /&gt;
function p.tableMerge(t1, t2)&lt;br /&gt;
	if (t1 == nil) then t1 = {} elseif (type(t1) ~= &#039;table&#039;) then t1 = {t1} end&lt;br /&gt;
	if (t2 == nil) then t2 = {} elseif (type(t2) ~= &#039;table&#039;) then t2 = {t2} end&lt;br /&gt;
    for k,v in pairs(t2) do&lt;br /&gt;
        if type(v) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            if type(t1[k] or false) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                p.tableMerge(t1[k] or {}, t2[k] or {})&lt;br /&gt;
            else&lt;br /&gt;
                if type(k) == &#039;number&#039; then table.insert(t1, v)&lt;br /&gt;
            	else t1[k] = v end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
        	if type(k) == &#039;number&#039; then table.insert(t1, v)&lt;br /&gt;
            else t1[k] = v end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return t1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- from https://stackoverflow.com/questions/640642/how-do-you-copy-a-lua-table-by-value&lt;br /&gt;
function p.copy(obj, seen)&lt;br /&gt;
  if type(obj) ~= &#039;table&#039; then return obj end&lt;br /&gt;
  if seen and seen[obj] then return seen[obj] end&lt;br /&gt;
  local s = seen or {}&lt;br /&gt;
  local res = setmetatable({}, getmetatable(obj))&lt;br /&gt;
  s[obj] = res&lt;br /&gt;
  for k, v in pairs(obj) do res[p.copy(k, s)] = p.copy(v, s) end&lt;br /&gt;
  return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- build normalized multilang label&lt;br /&gt;
function p.setNormalizedLabel(properties, use_fallbacks)&lt;br /&gt;
	if (use_fallbacks == nil) then use_fallbacks = true end&lt;br /&gt;
	if (properties[&#039;HasLabel&#039;] ~= nil) then &lt;br /&gt;
		labels = properties[&#039;HasLabel&#039;]&lt;br /&gt;
		if(type(labels) ~= &#039;table&#039;) then labels = {labels} end&lt;br /&gt;
		properties[&#039;HasNormalizedLabel&#039;] = {}&lt;br /&gt;
		for i, label in ipairs(labels) do&lt;br /&gt;
			label_norm = p.splitString(label, &#039;@&#039;)[1]:lower():gsub(&#039;[^%w]+&#039;,&#039;&#039;)&lt;br /&gt;
			label_lang = &amp;quot;en&amp;quot;&lt;br /&gt;
			if (p.splitString(label, &#039;@&#039;)[2] ~= nil) then label_lang = p.splitString(label, &#039;@&#039;)[2] end&lt;br /&gt;
			table.insert(properties[&#039;HasNormalizedLabel&#039;], label_norm .. &amp;quot;@&amp;quot; .. label_lang)	&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
	elseif (use_fallbacks and properties[&#039;HasName&#039;] ~= nil) then -- fallback, assume English lang&lt;br /&gt;
		labels = properties[&#039;HasName&#039;]&lt;br /&gt;
		if(type(labels) ~= &#039;table&#039;) then labels = {labels} end&lt;br /&gt;
		properties[&#039;HasNormalizedLabel&#039;] = {}&lt;br /&gt;
		for i, label in ipairs(labels) do&lt;br /&gt;
			label_norm = label:lower():gsub(&#039;[^%w]+&#039;,&#039;&#039;)&lt;br /&gt;
			table.insert(properties[&#039;HasNormalizedLabel&#039;], label_norm .. &amp;quot;@en&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	elseif (use_fallbacks and properties[&#039;Display title of&#039;] ~= nil) then -- fallback, assume English lang&lt;br /&gt;
		labels = properties[&#039;Display title of&#039;]&lt;br /&gt;
		if(type(labels) ~= &#039;table&#039;) then labels = {labels} end&lt;br /&gt;
		properties[&#039;HasNormalizedLabel&#039;] = {}&lt;br /&gt;
		for i, label in ipairs(labels) do&lt;br /&gt;
			label_norm = label:lower():gsub(&#039;[^%w]+&#039;,&#039;&#039;)&lt;br /&gt;
			table.insert(properties[&#039;HasNormalizedLabel&#039;], label_norm .. &amp;quot;@en&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW1969007d5acf40539642877659a02c23&amp;diff=2490</id>
		<title>Category:OSW1969007d5acf40539642877659a02c23</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW1969007d5acf40539642877659a02c23&amp;diff=2490"/>
		<updated>2024-07-06T02:22:21Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW3cb8cef2225e403092f098f99bc4c472&amp;diff=2489</id>
		<title>Category:OSW3cb8cef2225e403092f098f99bc4c472</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW3cb8cef2225e403092f098f99bc4c472&amp;diff=2489"/>
		<updated>2024-07-06T02:20:22Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): 3cb8cef2-225e-4030-92f0-98f99bc4c472&lt;br /&gt;
* FhG: 18dfa021-fa38-5833-947f-1ae363511b41&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[{{FULLPAGENAME}}]]&lt;br /&gt;
|?HasLabel={{#switch: {{USERLANGUAGECODE}} |de=Label (de) |#default=Label (en) }} |+lang={{USERLANGUAGECODE}} &lt;br /&gt;
|?HasNumberOfMembers={{#switch:{{USERLANGUAGECODE}} |en=Number of members|de=Mitarbeitende (Anzahl) |#default=Number of members }}&lt;br /&gt;
|format=datatable&lt;br /&gt;
|limit=5000&lt;br /&gt;
|sort=Display title of&lt;br /&gt;
|order=asc&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=2488</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=2488"/>
		<updated>2024-07-06T02:20:07Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW789dcd084860478dbc60361a2da7c823&amp;diff=2487</id>
		<title>Category:OSW789dcd084860478dbc60361a2da7c823</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW789dcd084860478dbc60361a2da7c823&amp;diff=2487"/>
		<updated>2024-07-06T02:19:55Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW5f4a3751d23e482d80fb0b72dcd6bc31&amp;diff=2486</id>
		<title>Category:OSW5f4a3751d23e482d80fb0b72dcd6bc31</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW5f4a3751d23e482d80fb0b72dcd6bc31&amp;diff=2486"/>
		<updated>2024-07-06T02:19:37Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW0e084decca6f48a7b023d6b7b2c1452d&amp;diff=2485</id>
		<title>Category:OSW0e084decca6f48a7b023d6b7b2c1452d</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW0e084decca6f48a7b023d6b7b2c1452d&amp;diff=2485"/>
		<updated>2024-07-06T02:19:34Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{#switch: {{USERLANGUAGECODE}} |en=Instances|de=Instanzen|#default=Instances}}==&lt;br /&gt;
{{#ask: [[{{FULLPAGENAME}}]]&lt;br /&gt;
|?HasStartDateAndTime={{#switch: {{USERLANGUAGECODE}} |en=Start date|de=Startdatum|#default=Start date}}&lt;br /&gt;
|?HasEndDateAndTime={{#switch: {{USERLANGUAGECODE}} |en=End date|de=Enddatum|#default=End date}}&lt;br /&gt;
|format=datatable&lt;br /&gt;
|limit=1000&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7&amp;diff=2484</id>
		<title>Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7&amp;diff=2484"/>
		<updated>2024-07-06T02:18:49Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): d9aa0bca-9b00-40d8-af6f-5c091bf9eec7 &lt;br /&gt;
* FhG: c3bd285c-1545-59a6-9183-32bee5aeed41&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=2483</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=2483"/>
		<updated>2024-07-06T02:18:30Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW44deaa5b806d41a2a88594f562b110e9&amp;diff=2482</id>
		<title>Category:OSW44deaa5b806d41a2a88594f562b110e9</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW44deaa5b806d41a2a88594f562b110e9&amp;diff=2482"/>
		<updated>2024-07-06T02:17:30Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73&amp;diff=2481</id>
		<title>Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73&amp;diff=2481"/>
		<updated>2024-07-06T02:17:30Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Template:Viewer/Link&amp;diff=2480</id>
		<title>Template:Viewer/Link</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Template:Viewer/Link&amp;diff=2480"/>
		<updated>2024-07-06T02:16:38Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#if: {{{page|}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;|[[{{#replace:{{#replace:{{{page}}}|File:|&amp;lt;nowiki/&amp;gt; Media:}}|Category:|&amp;lt;nowiki/&amp;gt; :Category:}}|{{#if:{{{label|}}}|{{{label}}}|&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{#ask: [[{{#replace:{{{page}}}|Category:|&amp;lt;nowiki/&amp;gt; :Category:}}]]|?HasLabel=|+lang={{USERLANGUAGECODE}}|mainlabel=-|format=plain}}&amp;lt;!--&lt;br /&gt;
  --&amp;gt;|{{#ask: [[{{#replace:{{{page}}}|Category:|&amp;lt;nowiki/&amp;gt; :Category:}}]]|?HasLabel=|+lang={{USERLANGUAGECODE}}|mainlabel=-|format=plain}}&amp;lt;!--&lt;br /&gt;
  --&amp;gt;|{{#ask: [[{{#replace:{{{page}}}|Category:|&amp;lt;nowiki/&amp;gt; :Category:}}]]|?HasLabel=|+lang=en|mainlabel=-|format=plain}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}]]&amp;lt;!--&lt;br /&gt;
--&amp;gt;|[{{{url}}} {{{label|{{{url}}}}}}]&amp;lt;!--&lt;br /&gt;
--&amp;gt;}}&amp;lt;nowiki /&amp;gt;&amp;lt;/onlyinclude&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
== Test ==&lt;br /&gt;
* {{{{FULLPAGENAME}}|page=Main Page}} test&lt;br /&gt;
* {{{{FULLPAGENAME}}|page=Main Page|label=The main page}} test&lt;br /&gt;
* {{{{FULLPAGENAME}}|url=https://google.com}} test&lt;br /&gt;
* {{{{FULLPAGENAME}}|page=Category:Entity}} category test&lt;br /&gt;
* {{{{FULLPAGENAME}}|page=File:OSW5f36a59d4bb94ea0bf93f08f7470f609.png}} file test&lt;br /&gt;
&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;page&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;Link target&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;label&amp;quot;: {}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;inline&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW3d238d05316e45a4ac95a11d7b24e36b&amp;diff=2479</id>
		<title>Category:OSW3d238d05316e45a4ac95a11d7b24e36b</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW3d238d05316e45a4ac95a11d7b24e36b&amp;diff=2479"/>
		<updated>2024-07-06T02:16:22Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): 3d238d05-316e-45a4-ac95-a11d7b24e36b&lt;br /&gt;
* FhG: ac5eecda-acca-513a-8e66-14462b59c5ee&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW9d63242855e44ab8b26d6ad9792a67b3&amp;diff=2478</id>
		<title>Category:OSW9d63242855e44ab8b26d6ad9792a67b3</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW9d63242855e44ab8b26d6ad9792a67b3&amp;diff=2478"/>
		<updated>2024-07-06T02:15:58Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWb8b6278763d54b0784eea9d3b3d183a4&amp;diff=2477</id>
		<title>Category:OSWb8b6278763d54b0784eea9d3b3d183a4</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWb8b6278763d54b0784eea9d3b3d183a4&amp;diff=2477"/>
		<updated>2024-07-06T02:15:38Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): b8b62787-63d5-4b07-84ee-a9d3b3d183a4&lt;br /&gt;
* FhG: fdd10d54-8474-5957-83a1-2ac4e40723a6&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[{{FULLPAGENAME}}]]&lt;br /&gt;
|?HasLabel={{#switch: {{USERLANGUAGECODE}} |de=Label (de) |#default=Label (en) }} |+lang={{USERLANGUAGECODE}} &lt;br /&gt;
|?HasOuNumber={{#switch:{{USERLANGUAGECODE}} |en=OU number|de=OE-Nummer |#default=OU number}}&lt;br /&gt;
|?HasManger={{#switch:{{USERLANGUAGECODE}} |en=Manager|de=Leitung |#default=Manager}}&lt;br /&gt;
|?HasDeputyManger={{#switch:{{USERLANGUAGECODE}} |en=Manager deputy|de=Leitung stv |#default=Manager deputy}}&lt;br /&gt;
|?HasSecretary={{#switch:{{USERLANGUAGECODE}} |en=Secretary|de=Sekretariat |#default=Secretary}}&lt;br /&gt;
|?HasSuperordinateOu={{#switch:{{USERLANGUAGECODE}} |en=Super OU|de=Über-OE |#default=Super OU}}&lt;br /&gt;
|?HasNumberOfMembers={{#switch:{{USERLANGUAGECODE}} |en=Number of members|de=Mitarbeitende (Anzahl) |#default=Number of members }}&lt;br /&gt;
|format=datatable&lt;br /&gt;
|limit=5000&lt;br /&gt;
|sort=Display title of&lt;br /&gt;
|order=asc&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=1662</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=1662"/>
		<updated>2024-06-23T03:49:43Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:Category&amp;diff=1660</id>
		<title>Category:Category</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:Category&amp;diff=1660"/>
		<updated>2024-06-23T03:44:19Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:Entity&amp;diff=1659</id>
		<title>Category:Entity</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:Entity&amp;diff=1659"/>
		<updated>2024-06-23T03:39:52Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=931</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=931"/>
		<updated>2024-06-01T08:13:14Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=930</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=930"/>
		<updated>2024-06-01T08:11:50Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Property:Visible_to&amp;diff=389</id>
		<title>Property:Visible to</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Property:Visible_to&amp;diff=389"/>
		<updated>2024-05-15T03:32:36Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW25bc4daf97644737a76434b88e1d5b21&amp;diff=388</id>
		<title>Category:OSW25bc4daf97644737a76434b88e1d5b21</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW25bc4daf97644737a76434b88e1d5b21&amp;diff=388"/>
		<updated>2024-05-15T03:32:35Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Item:OSWab093fd8af104a49882704cea3bbaf7b&amp;diff=387</id>
		<title>Item:OSWab093fd8af104a49882704cea3bbaf7b</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Item:OSWab093fd8af104a49882704cea3bbaf7b&amp;diff=387"/>
		<updated>2024-05-15T03:32:19Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWfa0d5710bc0f45819b61b65fc4fd9656&amp;diff=386</id>
		<title>Category:OSWfa0d5710bc0f45819b61b65fc4fd9656</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWfa0d5710bc0f45819b61b65fc4fd9656&amp;diff=386"/>
		<updated>2024-05-15T03:32:13Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW595b282aedf048788f3ee326454792ce&amp;diff=385</id>
		<title>Category:OSW595b282aedf048788f3ee326454792ce</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW595b282aedf048788f3ee326454792ce&amp;diff=385"/>
		<updated>2024-05-15T03:32:10Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWe5aa96bffb1c4d95be7fbd46142ad203&amp;diff=384</id>
		<title>Category:OSWe5aa96bffb1c4d95be7fbd46142ad203</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWe5aa96bffb1c4d95be7fbd46142ad203&amp;diff=384"/>
		<updated>2024-05-15T03:32:08Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Property:HasFileAttachment&amp;diff=383</id>
		<title>Property:HasFileAttachment</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Property:HasFileAttachment&amp;diff=383"/>
		<updated>2024-05-15T03:31:46Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=382</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=382"/>
		<updated>2024-05-15T03:31:36Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73&amp;diff=381</id>
		<title>Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW41ff0ef9d7cf4134bccf5bbbf1976f73&amp;diff=381"/>
		<updated>2024-05-15T03:31:24Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Item:OSWb777cbfaf4494138b4ed40d15c53f8a4&amp;diff=380</id>
		<title>Item:OSWb777cbfaf4494138b4ed40d15c53f8a4</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Item:OSWb777cbfaf4494138b4ed40d15c53f8a4&amp;diff=380"/>
		<updated>2024-05-15T03:31:21Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW9d63242855e44ab8b26d6ad9792a67b3&amp;diff=379</id>
		<title>Category:OSW9d63242855e44ab8b26d6ad9792a67b3</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW9d63242855e44ab8b26d6ad9792a67b3&amp;diff=379"/>
		<updated>2024-05-15T03:31:12Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW205fc8dcd20646e586969cf4a0aeca65&amp;diff=378</id>
		<title>Item:OSW205fc8dcd20646e586969cf4a0aeca65</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW205fc8dcd20646e586969cf4a0aeca65&amp;diff=378"/>
		<updated>2024-05-15T03:31:06Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=377</id>
		<title>File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&amp;diff=377"/>
		<updated>2024-05-15T03:31:03Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Maintenance script uploaded a new version of File:OSW49d68bb7a5de413ba1077bc5f459a766.drawio.svg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7&amp;diff=376</id>
		<title>Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd9aa0bca9b0040d8af6f5c091bf9eec7&amp;diff=376"/>
		<updated>2024-05-15T03:30:59Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): d9aa0bca-9b00-40d8-af6f-5c091bf9eec7 &lt;br /&gt;
* FhG: c3bd285c-1545-59a6-9183-32bee5aeed41&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW09f6cdd54bc54de786eafced5f675cbe&amp;diff=375</id>
		<title>Category:OSW09f6cdd54bc54de786eafced5f675cbe</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW09f6cdd54bc54de786eafced5f675cbe&amp;diff=375"/>
		<updated>2024-05-15T03:30:56Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWbe80b28aefd64921ba2e8e2d6225416e&amp;diff=374</id>
		<title>Category:OSWbe80b28aefd64921ba2e8e2d6225416e</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWbe80b28aefd64921ba2e8e2d6225416e&amp;diff=374"/>
		<updated>2024-05-15T03:30:45Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW03a4ea630fa74256bce1d5cba21dece6&amp;diff=373</id>
		<title>Item:OSW03a4ea630fa74256bce1d5cba21dece6</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW03a4ea630fa74256bce1d5cba21dece6&amp;diff=373"/>
		<updated>2024-05-15T03:30:42Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW473d7a1ed48544d1be83b258b5810948&amp;diff=372</id>
		<title>Category:OSW473d7a1ed48544d1be83b258b5810948</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW473d7a1ed48544d1be83b258b5810948&amp;diff=372"/>
		<updated>2024-05-15T03:30:38Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Namespaces ==&lt;br /&gt;
for UUID generation via uuid5&lt;br /&gt;
&lt;br /&gt;
* General (same as UUID of the category page): 473d7a1e-d485-44d1-be83-b258b5810948&lt;br /&gt;
* FhG: a7ff3f4c-ea08-5143-af94-7c8a925aba56&lt;br /&gt;
&lt;br /&gt;
{{#ask: [[{{FULLPAGENAME}}]]&lt;br /&gt;
|?HasName={{#switch: {{USERLANGUAGECODE}} |en=Name |de=Name |#default=Name }}&lt;br /&gt;
|?HasGpsCoordinates={{#switch: {{USERLANGUAGECODE}} |en=GPS coordinates |de=GPS-Koordinaten |#default=GPS coordinates }}&lt;br /&gt;
|?HasNumberOfBuildings={{#switch: {{USERLANGUAGECODE}} |en=Number of buildings |de=Gebäude (Anzahl) |#default=Number of buildings }}&lt;br /&gt;
|?HasNumberOfOccupants={{#switch: {{USERLANGUAGECODE}} |en=Number of Occupants |de=Belegung (Anzahl) |#default=Number of Occupants }}&lt;br /&gt;
|format=datatable&lt;br /&gt;
|limit=5000&lt;br /&gt;
|sort=Display title of&lt;br /&gt;
|order=asc&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Property:HasOswId&amp;diff=371</id>
		<title>Property:HasOswId</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Property:HasOswId&amp;diff=371"/>
		<updated>2024-05-15T03:30:36Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW81e9e22e7d934382a6a56df7d3736957&amp;diff=370</id>
		<title>Category:OSW81e9e22e7d934382a6a56df7d3736957</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW81e9e22e7d934382a6a56df7d3736957&amp;diff=370"/>
		<updated>2024-05-15T03:30:29Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd7085ef89b0e4a69ac4f2d28bda2d2c0&amp;diff=369</id>
		<title>Category:OSWd7085ef89b0e4a69ac4f2d28bda2d2c0</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWd7085ef89b0e4a69ac4f2d28bda2d2c0&amp;diff=369"/>
		<updated>2024-05-15T03:30:24Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW137e7443b2b94692bd59a0e0a6778b70&amp;diff=368</id>
		<title>Category:OSW137e7443b2b94692bd59a0e0a6778b70</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW137e7443b2b94692bd59a0e0a6778b70&amp;diff=368"/>
		<updated>2024-05-15T03:29:42Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWb2d7e6a2eff94c82b7f1f2699d5b0ee3&amp;diff=367</id>
		<title>Category:OSWb2d7e6a2eff94c82b7f1f2699d5b0ee3</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSWb2d7e6a2eff94c82b7f1f2699d5b0ee3&amp;diff=367"/>
		<updated>2024-05-15T03:29:39Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{#switch:{{USERLANGUAGECODE}}|en=Gantt Chart|de=Gantt Diagramm|#default=Gantt Chart}}==&lt;br /&gt;
{{#ask:&lt;br /&gt;
 [[{{FULLPAGENAME}}]]&lt;br /&gt;
 |?Display title of=task&lt;br /&gt;
 |?Issue Status=status&lt;br /&gt;
 |?HasStartDate=startdate&lt;br /&gt;
 |?HasEndDate=enddate&lt;br /&gt;
 |?Related To Epic=section&lt;br /&gt;
 |?Issue Priority=priority&lt;br /&gt;
 |format=gantt&lt;br /&gt;
 |axisformat=%d/%m/%Y&lt;br /&gt;
 |diagramtitle=Projects&lt;br /&gt;
 |statusmapping=2 (in progress)=&amp;gt;active;3 (completed)=&amp;gt;done&lt;br /&gt;
 |prioritymapping=1 (high)=&amp;gt;crit; 2 (normal)=&amp;gt;crit&lt;br /&gt;
 |sortkey=title&lt;br /&gt;
 |leftpadding=120&lt;br /&gt;
 |titletopmargin=25&lt;br /&gt;
 |bargap=5&lt;br /&gt;
 |barheight=25&lt;br /&gt;
 |theme=neutral&lt;br /&gt;
 |limit=1000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{#switch:{{USERLANGUAGECODE}}|en=Overview Table|de=Übersichtstabelle|#default=Overview Table}}==&lt;br /&gt;
{{#ask: [[{{FULLPAGENAME}}]]&lt;br /&gt;
|?HasDescription={{#switch:{{USERLANGUAGECODE}}|en=Description|de=Beschreibung|#default=Description}} |+lang={{USERLANGUAGECODE}}&lt;br /&gt;
|?HasStartDate={{#switch:{{USERLANGUAGECODE}}|en=Start|de=Beginn|#default=Start}}&lt;br /&gt;
|?HasEndDate={{#switch:{{USERLANGUAGECODE}}|en=End|de=Ende|#default=End}}&lt;br /&gt;
|format=datatable&lt;br /&gt;
|limit=1000&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW5427361692374c8eaa6bd3733b92d343&amp;diff=366</id>
		<title>Category:OSW5427361692374c8eaa6bd3733b92d343</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW5427361692374c8eaa6bd3733b92d343&amp;diff=366"/>
		<updated>2024-05-15T03:29:36Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Property:HasOutput&amp;diff=365</id>
		<title>Property:HasOutput</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Property:HasOutput&amp;diff=365"/>
		<updated>2024-05-15T03:29:32Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW3b8775e87e84421daa886ec88296c21d&amp;diff=364</id>
		<title>Item:OSW3b8775e87e84421daa886ec88296c21d</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Item:OSW3b8775e87e84421daa886ec88296c21d&amp;diff=364"/>
		<updated>2024-05-15T03:29:30Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Template:Editor/Kekule/Default&amp;diff=363</id>
		<title>Template:Editor/Kekule/Default</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Template:Editor/Kekule/Default&amp;diff=363"/>
		<updated>2024-05-15T03:29:29Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Core&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{&lt;br /&gt;
    &amp;quot;coordPos2D&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;coordPos3D&amp;quot;: 0,&lt;br /&gt;
    &amp;quot;defAutoScaleRefLength&amp;quot;: 0.6200123411069938,&lt;br /&gt;
    &amp;quot;root&amp;quot;: {&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;o1&amp;quot;,&lt;br /&gt;
        &amp;quot;coordPos2D&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;coordPos3D&amp;quot;: 0,&lt;br /&gt;
        &amp;quot;children&amp;quot;: {&lt;br /&gt;
            &amp;quot;id&amp;quot;: &amp;quot;o2&amp;quot;,&lt;br /&gt;
            &amp;quot;coordPos2D&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;coordPos3D&amp;quot;: 0,&lt;br /&gt;
            &amp;quot;items&amp;quot;: [&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;__type__&amp;quot;: &amp;quot;Kekule.TextBlock&amp;quot;,&lt;br /&gt;
                    &amp;quot;id&amp;quot;: &amp;quot;t1&amp;quot;,&lt;br /&gt;
                    &amp;quot;coordPos2D&amp;quot;: 21,&lt;br /&gt;
                    &amp;quot;coordPos3D&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;needRecalcSize&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;coord2D&amp;quot;: {&lt;br /&gt;
                        &amp;quot;x&amp;quot;: 6.712666946385053,&lt;br /&gt;
                        &amp;quot;y&amp;quot;: 36.78739890568163,&lt;br /&gt;
                        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;size2D&amp;quot;: {&lt;br /&gt;
                        &amp;quot;x&amp;quot;: 8.075775784270949,&lt;br /&gt;
                        &amp;quot;y&amp;quot;: 0.3472069110199172,&lt;br /&gt;
                        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;text&amp;quot;: &amp;quot;Öffne den Editor um dieses Dokument zu bearbeiten&amp;quot;&lt;br /&gt;
                },&lt;br /&gt;
                {&lt;br /&gt;
                    &amp;quot;__type__&amp;quot;: &amp;quot;Kekule.TextBlock&amp;quot;,&lt;br /&gt;
                    &amp;quot;id&amp;quot;: &amp;quot;t2&amp;quot;,&lt;br /&gt;
                    &amp;quot;coordPos2D&amp;quot;: 21,&lt;br /&gt;
                    &amp;quot;coordPos3D&amp;quot;: 0,&lt;br /&gt;
                    &amp;quot;needRecalcSize&amp;quot;: true,&lt;br /&gt;
                    &amp;quot;coord2D&amp;quot;: {&lt;br /&gt;
                        &amp;quot;x&amp;quot;: 6.712666946385053,&lt;br /&gt;
                        &amp;quot;y&amp;quot;: 36.258321707936986,&lt;br /&gt;
                        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;size2D&amp;quot;: {&lt;br /&gt;
                        &amp;quot;x&amp;quot;: 5.786781850331941,&lt;br /&gt;
                        &amp;quot;y&amp;quot;: 0.3472069110199172,&lt;br /&gt;
                        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;text&amp;quot;: &amp;quot;Open the Editor to edit this Document&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            ],&lt;br /&gt;
            &amp;quot;__type__&amp;quot;: &amp;quot;Kekule.ChemObjList&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;__type__&amp;quot;: &amp;quot;Kekule.ChemSpaceElement&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;enableAutoId&amp;quot;: true,&lt;br /&gt;
    &amp;quot;screenSize&amp;quot;: {&lt;br /&gt;
        &amp;quot;x&amp;quot;: 900,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 1500,&lt;br /&gt;
        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;size2D&amp;quot;: {&lt;br /&gt;
        &amp;quot;x&amp;quot;: 22.320444279851777,&lt;br /&gt;
        &amp;quot;y&amp;quot;: 37.200740466419624,&lt;br /&gt;
        &amp;quot;__type__&amp;quot;: &amp;quot;object&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;__type__&amp;quot;: &amp;quot;Kekule.ChemDocument&amp;quot;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW8cb1935054464c99836d3bc0573a11cc&amp;diff=362</id>
		<title>Category:OSW8cb1935054464c99836d3bc0573a11cc</title>
		<link rel="alternate" type="text/html" href="https://battery.knowledge-graph.eu/w/index.php?title=Category:OSW8cb1935054464c99836d3bc0573a11cc&amp;diff=362"/>
		<updated>2024-05-15T03:29:21Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Update package: OSW Base&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>