Module:Tabular data and Module:Tabular data/sandbox: Difference between pages
(Difference between pages)
imported>MusikBot II m Protected "Module:Tabular data": High-risk template or module: 385 transclusions (more info) ([Edit=Require autoconfirmed or confirmed access] (indefinite)) |
imported>Jts1882 make minimal version of function (explicit column indices, one occurrence etc) |
||
| Line 89: | Line 89: | ||
function p._lookup(args) | function p._lookup(args) | ||
local data = args.data or mw.ext.data.get(args[1]) | |||
--local data = args.data or mw.ext.data.get(args[1]) | |||
local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing | |||
local data = args.data or mw.ext.data.get(page) | |||
local searchValue = args.search_value | local searchValue = args.search_value | ||
local searchPattern = args.search_pattern | local searchPattern = args.search_pattern | ||
| Line 114: | Line 118: | ||
if (searchValue and record[searchColumnIdx] == searchValue) or | if (searchValue and record[searchColumnIdx] == searchValue) or | ||
(searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then | (searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then | ||
numMatchingRecords = numMatchingRecords + 1 | |||
if numMatchingRecords == math.abs(occurrence) then | |||
local args = mw.clone(args) | |||
args.data = data | |||
args.output_row = i | |||
return p._cell(args) | |||
end | |||
end | |||
end | |||
end | |||
function p._lookup2(args) | |||
--local data = args.data or mw.ext.data.get(args[1]) | |||
local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing | |||
local data = args.data or mw.ext.data.get(page) | |||
local searchValue = args.search_value | |||
local searchPattern = args.search_pattern | |||
local searchColumnName = args.search_column | |||
local searchValue2 = args.search_value2 | |||
local searchPattern2 = args.search_pattern2 | |||
local searchColumnName2 = args.search_column2 | |||
local searchColumnIdx | |||
for i, field in ipairs(data.schema.fields) do | |||
if field.name == searchColumnName then | |||
searchColumnIdx = i | |||
end | |||
if searchColumnIdx then | |||
break | |||
end | |||
end | |||
assert(searchColumnIdx, mw.ustring.format("Search column “%s” not found.", searchColumnName)) | |||
local searchColumnIdx2 | |||
for i, field in ipairs(data.schema.fields) do | |||
if field.name == searchColumnName2 then | |||
searchColumnIdx2 = i | |||
end | |||
if searchColumnIdx2 then | |||
break | |||
end | |||
end | |||
assert(searchColumnIdx2, mw.ustring.format("Search column “%s” not found.", searchColumnName2)) | |||
local occurrence = tonumber(args.occurrence) or 1 | |||
local numMatchingRecords = 0 | |||
for i = (occurrence < 0 and #data.data or 1), | |||
(occurrence < 0 and 1 or #data.data), | |||
(occurrence < 0 and -1 or 1) do | |||
local record = data.data[i] | |||
if (searchValue and tostring(record[searchColumnIdx]) == searchValue) | |||
and (searchValue2 and tostring(record[searchColumnIdx2]) == searchValue2) then | |||
-- or (searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then | |||
if (1==1) then return data.data[i][3] end -- just return single occurence | |||
numMatchingRecords = numMatchingRecords + 1 | numMatchingRecords = numMatchingRecords + 1 | ||
if numMatchingRecords == math.abs(occurrence) then | if numMatchingRecords == math.abs(occurrence) then | ||
| Line 134: | Line 198: | ||
return p._lookup(frame.args) | return p._lookup(frame.args) | ||
end | end | ||
--- As p.lookup() except requiring match of values in two columns | |||
--- Usage: {{#invoke: Tabular data | lookup2 | Table name | search_value = Value to find in column | search_pattern = Pattern to find in column | search_column = Name of column to search in | search_value2 = Value to find in second column | search_pattern2 = Pattern to find in second column | search_column2 = Name of second column to search in | occurrence = 1-based index of the matching row to output | output_column = Name of column to output | output_column2 = Name of another column to output | … | output_format = String format to output the values in }} | |||
function p.lookup2(frame) | |||
--return p._lookup2(frame.args) | |||
return p.lookup2_minimal(frame.args) | |||
end | |||
-- version for testing resources | |||
function p.lookup2_minimal(args) | |||
--local page = mw.text.trim(args[1]) -- "UN:Total population, both sexes combined.tab" -- set page name explicitly for testing | |||
local data = args.data or mw.ext.data.get("UN:Total population, both sexes combined.tab" ) | |||
local searchValue = args.search_value | |||
--local searchPattern = args.search_pattern | |||
--local searchColumnName = args.search_column | |||
local searchValue2 = args.search_value2 | |||
--local searchPattern2 = args.search_pattern2 | |||
--local searchColumnName2 = args.search_column2 | |||
local searchColumnIdx = 1 | |||
local searchColumnIdx2 = 2 | |||
--local occurrence = tonumber(args.occurrence) or 1 | |||
local numMatchingRecords = 0 | |||
for i = 1, #data.data, 1 do | |||
local record = data.data[i] | |||
if (searchValue and tostring(record[searchColumnIdx]) == searchValue) | |||
and (searchValue2 and tostring(record[searchColumnIdx2]) == searchValue2) then | |||
-- or (searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then | |||
return data.data[i][3] -- just return single occurence | |||
end | |||
end | |||
end | |||
function p._wikitable(args) | function p._wikitable(args) | ||