更改

跳到导航 跳到搜索
添加2,123字节 、 2021年3月24日 (三) 11:58
无编辑摘要
第1行: 第1行: −
p = {}
+
local SMWUtils = require("Module:SMWUtils")
 +
local ListUtils = require("Module:ListUtils")
 +
local p = {}
   −
function p.keys_to_table(set)
+
function _merge_keys(a, b)
 
     local res = {}
 
     local res = {}
     for k, v in ipairs(set) do
+
     for k, _ in pairs(a) do
         table.insert(set, k)
+
         res[k] = true
 +
    end
 +
    for k, _ in pairs(b) do
 +
        res[k] = true
 
     end
 
     end
 
     return res
 
     return res
 
end
 
end
   −
function p.query_inherited_property(anchor_property, query_property, parent_list)
+
 
 +
function p.query_inherited_property(query_property, parent_list)
 
     local results = {}
 
     local results = {}
 
     for idx, parent in ipairs(parent_list) do
 
     for idx, parent in ipairs(parent_list) do
         local anchor_query = "[["..anchor_property.."::"..parent.."]]"
+
         local anchor_query = "[["..parent.."]]"
 
         local property_query = "[[" .. query_property .. "::+]]"
 
         local property_query = "[[" .. query_property .. "::+]]"
        local content_query = "?"..query_property
+
         local query = anchor_query .. property_query
         local query = anchor_query .. property_query .. "|" ..content_query .. "|format=plainlist"
+
         local res = SMWUtils.query_page_properties(query, {query_property})
         local res = mw.smw.getQueryResult(query)
+
         for j, r in ipairs(res) do
         for j, r in ipairs(res.results) do
+
             results[r.properties[query_property]] = true
             for k, t in ipairs(r.printouts[query_property]) do
  −
                results[t] = true
  −
            end
   
         end
 
         end
 
     end
 
     end
 
     return results
 
     return results
 
end
 
end
 +
 +
function p.query_by_reference(name, query_property)
 +
    local query = "[["..query_property.."::"..name.."]]"
 +
    return ListUtils.list_to_set(SMWUtils.query_pages(query))
 +
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 _split_or_empty(value)
 +
    if value and #value > 0 then
 +
        return mw.text.split(value, ",")
 +
    else
 +
        return {}
 +
    end
 +
end
 +
 +
function p.inherited_lists(frame)
 +
    local name = frame.args.name
 +
    local parents = _split_or_empty(frame.args.parents)
 +
    local parent_property = frame.args.parent_property
 +
    local parent_title = frame.args.parent_title
 +
    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)
 +
    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 = _split_or_empty(frame.args[prop.."_values"])
 +
        local reversed = frame.args[prop.."_reversed"]
 +
        local values_set = ListUtils.list_to_set(values)
 +
        local inherited_values = p.query_inherited_property(prop, parents)
 +
        local final_values = _merge_keys(values_set, inherited_values)
 +
        if reversed then
 +
            local reversed_values = p.query_by_reference(name, reversed)
 +
            final_values = _merge_keys(final_values, reversed_values)
 +
        end
 +
 +
        local final_list = ListUtils.set_to_list(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_by_reference(name, parent_property)
 +
        local children_list = ListUtils.set_to_list(children)
 +
        _create_list(root, children_title, children_list)
 +
    end
 +
 +
    return root:done()
 +
end
 +
 
return p
 
return p

导航菜单