Module:Template input parse: Difference between revisions
Bugfix with parsing kv-pairs |
m testing...? |
||
(6 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
-- Helper module for various modules that require entry of multiple labels/values | -- Helper module for various modules that require entry of multiple labels/values | ||
-- Helper function | -- Helper function | ||
Line 11: | Line 8: | ||
function p.parse_entries(unparsed, delimiter) | function p.parse_entries(unparsed, delimiter) | ||
local parsed = {} | local parsed = {} | ||
local delimiter = delimiter or | local delimiter = delimiter or ";" | ||
local expr = | local expr = "([^" .. delimiter .. "]+)" | ||
for entry in string.gmatch(unparsed, expr) do | for entry in string.gmatch(unparsed, expr) do | ||
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | ||
Line 26: | Line 23: | ||
function p.parse_numeric_entries(unparsed, delimiter) | function p.parse_numeric_entries(unparsed, delimiter) | ||
local parsed = {} | local parsed = {} | ||
local delimiter = delimiter or | local delimiter = delimiter or ";" | ||
local expr = | local expr = "([^" .. delimiter .. "]+)" | ||
for entry in string.gmatch(unparsed, expr) do | for entry in string.gmatch(unparsed, expr) do | ||
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | ||
Line 40: | Line 37: | ||
function p.parse_pair(unparsed, delimiter) | function p.parse_pair(unparsed, delimiter) | ||
local parsed = {} | local parsed = {} | ||
local delimiter = delimiter or | local delimiter = delimiter or ":" | ||
local expr = | local expr = "([^" .. delimiter .. "]+)" | ||
for entry in string.gmatch(unparsed, expr) do | for entry in string.gmatch(unparsed, expr) do | ||
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | ||
Line 55: | Line 52: | ||
-- Helper function | -- Helper function | ||
-- Parses a pair of numeric values | -- Parses a pair of numeric values | ||
function p.parse_numeric_pair(unparsed, delimiter) | -- Passing in TRUE for is_fuzzy allows singular values to be parsed as ratios | ||
-- whose denominator is 1; default is FALSE | |||
function p.parse_numeric_pair(unparsed, delimiter, is_fuzzy) | |||
local parsed = {} | local parsed = {} | ||
local delimiter = delimiter or | local delimiter = delimiter or ":" | ||
local expr = | local is_fuzzy = is_fuzzy or false | ||
local expr = "([^" .. delimiter .. "]+)" | |||
for entry in string.gmatch(unparsed, expr) do | for entry in string.gmatch(unparsed, expr) do | ||
local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | local trimmed = entry:gsub("^%s*(.-)%s*$", "%1") | ||
Line 66: | Line 66: | ||
if #parsed == 2 then | if #parsed == 2 then | ||
return parsed | return parsed | ||
elseif #parsed == 1 and is_fuzzy then | |||
return { parsed[1], 1 } | |||
else | else | ||
return nil | return nil | ||
Line 73: | Line 75: | ||
-- Helper function | -- Helper function | ||
-- Parses a list of numeric pairs | -- Parses a list of numeric pairs | ||
-- Delimiter between each | -- Delimiter between each entry can be anything; default is semicolon; this | ||
-- allows for entry of subgroup entries | |||
-- Delimiter between the pair's two values can be anything; default is slash | -- Delimiter between the pair's two values can be anything; default is slash | ||
-- as the intended use is parsing ratios a/b, so input must be formatted as such | -- as the intended use is parsing ratios a/b, so input must be formatted as such | ||
-- "a/b; c/d; e/f" | -- "a/b; c/d; e/f" | ||
function p.parse_numeric_pairs(unparsed, | -- Passing in TRUE for is_fuzzy allows singular values to be parsed as ratios | ||
local | -- whose denominator is 1; defualt is FALSE. | ||
function p.parse_numeric_pairs(unparsed, delimiter1, delimiter2, is_fuzzy) | |||
local delimiter1 = delimiter1 or ";" | |||
local delimiter2 = delimiter2 or "/" | |||
local is_fuzzy = is_fuzzy or false | |||
-- Split the string of unparsed pairs | -- Split the string of unparsed pairs | ||
local parsed = p.parse_entries(unparsed) | local parsed = p.parse_entries(unparsed, delimiter1) | ||
-- Then tokenize the tokens into numeric pairs | -- Then tokenize the tokens into numeric pairs | ||
local pairs_ = {} | local pairs_ = {} | ||
for i = 1, #parsed do | for i = 1, #parsed do | ||
local pair = p.parse_numeric_pair(parsed[i], | local pair = p.parse_numeric_pair(parsed[i], delimiter2, is_fuzzy) | ||
if pair ~= nil and #pair == 2 then | if pair ~= nil and #pair == 2 then | ||
table.insert(pairs_, pair) | table.insert(pairs_, pair) | ||
end | end | ||
end | end | ||
return pairs_ | |||
end | end | ||
Line 104: | Line 107: | ||
-- Then tokenize the tokens into key-value pairs | -- Then tokenize the tokens into key-value pairs | ||
local pairs_ = {} | local pairs_ = {} | ||
local num_pairs = 0 | --local num_pairs = 0 | ||
for i = 1, #parsed do | for i = 1, #parsed do | ||
local pair = p.parse_pair(parsed[i]) | local pair = p.parse_pair(parsed[i]) | ||
if pair ~= nil and #pair == 2 then | if pair ~= nil and #pair == 2 then | ||
pairs_[pair[1]] = pair[2] | pairs_[pair[1]] = pair[2] | ||
num_pairs = num_pairs + 1 | --num_pairs = num_pairs + 1 | ||
end | end | ||
end | end | ||
return pairs_ | |||
end | |||
function p.tester() | |||
local parse_me = "15625/15552; 325/324, 625/624" | |||
local parsed_me = p.parse_entries(parse_me, ";") | |||
local parsed_me_2 = {} | |||
for i = 1, #parsed_me do | |||
local parsed = p.parse_numeric_pairs(parsed_me[i], ",", false) | |||
table.insert(parsed_me_2, parsed) | |||
end | end | ||
return parsed_me_2 | |||
end | end | ||
return p | return p |