Modul:Brug Wikidata/sandkasse: Forskelle mellem versioner
Content deleted Content added
Poul G (diskussion | bidrag) m wip |
Poul G (diskussion | bidrag) wip (2) |
||
Linje 580:
end
-- sorter, hvis angivet (og der er mere end ét udsagn)
if ( args.sort or "" ) ~= "" and (#statements > 1) then
-- args.sort fortolkes og resultatet lægges i tabellen sortParsed
for k, v in pairs(statements) do▼
local sortArgs, sortParsed = "P1545- værdi- fejl", {}
for sortPart in sortArgs:gmatch("%S*") do -- der kan angives flere sorteringskriterier adskildt af mellemrum; de overordnede angives først
v["sortkey"] = v["qualifiers"][args.sort][1]["datavalue"]["value"]▼
local _, _, num, ascdesc = sortPart:find("[Pp](%d+)([+-]?)") -- der kan sorteres efter kvalifikatorer angivet som fx P1545, evt efterstillet med +/- for stigende/faldende sortering
table.insert(sortParsed, {type="P", key="P" .. num, ascdesc=ascdesc})
else▼
local _, _, value, ascdesc = mw.ustring.lower(sortPart):find("(værdi)([+-]?)") -- eller der kan sorteres (alfabetisk) efter de viste værdier for udsagnet, fx værdi-
if value then
table.insert(sortParsed, {type="VÆRDI", ascdesc=ascdesc})
else▼
mw.addWarning("ugyldigt sorterings-element: " .. sortPart)
end
end
end
end
-- dan sorteringsnøgle for de enkelte statements (for hvert kriterie)
stmt.sortKeys = {}
for ks, vs in pairs(sortParsed) do
local sortKey = "?"
if vs.type == "P" then
if stmt.qualifiers
and stmt.qualifiers[vs.key]
and stmt.qualifiers[vs.key][1]
and stmt.qualifiers[vs.key][1]["datavalue"]
then
sortKey = stmt.qualifiers[vs.key][1]["datavalue"]["value"] -- todo andre datatyper
end
elseif vs.type == "VÆRDI" then
-- todo
end
stmt.sortKeys[ks] = sortKey
end
end
-- udfør sorteringen TODO fejler pt.
local log = "log: "
table.sort(statements, function(a, b)
log = log .. " cmp: " .. mw.dumpObject({a=a.sortKeys, b=b.sortKeys})
▲ if a.sortkey ~= nil then
for ks, vs in pairs(sortParsed) do
▲ if b.sortkey ~= nil then
local function flip(boo) -- vender sorteringen, hvis der har stået et - (minus) efter kriteriet
local ret = boo
▲ else
if vs.ascdesc == "-" then ret = not ret end
return -1▼
log = log .. " gav " .. tostring(ret)
end
if a.sortKeys[ks] < b.sortKeys[ks] then
▲ else
return
elseif a.sortKeys[ks] > b.sortKeys[ks] then
return flip(false)
end -- check næste
end
return true -- de var ens, bibehold sorteringen
end)
return nil, nil, "Sort: " .. args.sort .. log .. mw.dumpObject(sortParsed) .. " statements" ..
end
|