“模块:Inherit”的版本间的差异
跳到导航
跳到搜索
第40行: | 第40行: | ||
results[t] = true | results[t] = true | ||
end | end | ||
+ | end | ||
+ | end | ||
+ | return results | ||
+ | end | ||
+ | |||
+ | function p.query_children(name, anchor_property, parent_property) | ||
+ | local results = {} | ||
+ | local anchor_query = "[["..parent_property.."::"..name.."]]" | ||
+ | local property_query = "[[" .. anchor_property .. "::+]]" | ||
+ | local content_query = "?"..query_property | ||
+ | local query = anchor_query .. property_query .. "|" ..content_query .. "|format=plainlist" | ||
+ | local res = mw.smw.getQueryResult(query) | ||
+ | for j, r in ipairs(res.results) do | ||
+ | for k, t in ipairs(r.printouts[query_property]) do | ||
+ | results[t] = true | ||
end | end | ||
end | end | ||
第57行: | 第72行: | ||
local name = frame.args.name | local name = frame.args.name | ||
local parents = mw.text.split(frame.args.parents, ",") | local parents = mw.text.split(frame.args.parents, ",") | ||
+ | local parent_property = frame.args.parent_property | ||
local parent_title = frame.args.parent_title | local parent_title = frame.args.parent_title | ||
local anchor_property = frame.args.anchor_property | local anchor_property = frame.args.anchor_property | ||
local properties = mw.text.split(frame.args.properties, ",") | local properties = mw.text.split(frame.args.properties, ",") | ||
+ | local children_title = frame.args.children_title | ||
local root = mw.html.create("div") | local root = mw.html.create("div") | ||
第65行: | 第82行: | ||
_create_list(root, parent_title, parents) | _create_list(root, parent_title, parents) | ||
mw.smw.set({[anchor_property]=name}) | mw.smw.set({[anchor_property]=name}) | ||
+ | for i, parent in ipairs(parents) do | ||
+ | mw.smw.set({[parent_property]=parent}) | ||
+ | end | ||
for i, prop in ipairs(properties) do | for i, prop in ipairs(properties) do | ||
第78行: | 第98行: | ||
mw.smw.set({[prop]=k}) | mw.smw.set({[prop]=k}) | ||
end | end | ||
+ | end | ||
+ | |||
+ | if children_title then | ||
+ | local children = p.query_children(name, anchor_property, parent_property) | ||
+ | local children_list = _keys_to_table(children) | ||
+ | _create_list(root, children_title, children_list) | ||
end | end | ||
2020年12月31日 (四) 17:15的版本
{{#invoke:Inherit|inherited_lists |name=页面名称 |properties=属性1,属性2,属性3 |anchor_property=页面标题属性 |parent_property=父类属性名称 |parent_title=父类标题 |parents=父类1,父类2,父类3 |children_title=子类标题(可选) |属性1_title=属性1的标题 |属性1_values=标签1,标签2 |属性2_title=属性2的标题 |属性2_values=标签3,标签4 |属性3_title=属性3的标题 |属性3_values=标签5,标签6 |属性1_reversed=属性2 |属性2_reversed=属性1 }}
p = {} function _table_to_keys(tb) local res = {} for i, k in ipairs(tb) do res[k] = true end return res end function _merge_keys(a, b) local res = {} for k, _ in ipairs(a) do res[k] = true end for k, _ in ipairs(b) do res[k] = true end return res end function _keys_to_table(set) local res = {} for k, v in ipairs(set) do table.insert(set, k) end return res end function p.query_inherited_property(anchor_property, query_property, parent_list) local results = {} for idx, parent in ipairs(parent_list) do local anchor_query = "[["..anchor_property.."::"..parent.."]]" local property_query = "[[" .. query_property .. "::+]]" local content_query = "?"..query_property local query = anchor_query .. property_query .. "|" ..content_query .. "|format=plainlist" local res = mw.smw.getQueryResult(query) for j, r in ipairs(res.results) do for k, t in ipairs(r.printouts[query_property]) do results[t] = true end end end return results end function p.query_children(name, anchor_property, parent_property) local results = {} local anchor_query = "[["..parent_property.."::"..name.."]]" local property_query = "[[" .. anchor_property .. "::+]]" local content_query = "?"..query_property local query = anchor_query .. property_query .. "|" ..content_query .. "|format=plainlist" local res = mw.smw.getQueryResult(query) for j, r in ipairs(res.results) do for k, t in ipairs(r.printouts[query_property]) do results[t] = true end end return results end function _create_list(root, title, list) local node = root:tag("div") node:wikitext([[ ''' ]] .. title .. [[''':]]) local ul = node:tag("ul") for k, v in ipairs(list) do ul:tag("li"):wikitext("[["..v.."]]") end end function p.inherited_lists(frame) local name = frame.args.name local parents = mw.text.split(frame.args.parents, ",") local parent_property = frame.args.parent_property local parent_title = frame.args.parent_title local anchor_property = frame.args.anchor_property local properties = mw.text.split(frame.args.properties, ",") local children_title = frame.args.children_title local root = mw.html.create("div") _create_list(root, parent_title, parents) mw.smw.set({[anchor_property]=name}) for i, parent in ipairs(parents) do mw.smw.set({[parent_property]=parent}) end for i, prop in ipairs(properties) do local title = frame.args[prop.."_title"] local values_str = frame.args[prop.."_values"] local values = (values_str and #values_str > 0) and mw.text.split(values_str, ",") or {} local values_set = _table_to_keys(values) local inherited_values = p.query_inherited_property(anchor_property, prop, parents) local final_values = _merge_keys(values_set, inherited_values) local final_list = _keys_to_table(final_values) _create_list(root, title, final_list) for i, k in ipairs(final_list) do mw.smw.set({[prop]=k}) end end if children_title then local children = p.query_children(name, anchor_property, parent_property) local children_list = _keys_to_table(children) _create_list(root, children_title, children_list) end return root:done() end return p