Module:Template input parse: Difference between revisions

From Xenharmonic Wiki
Jump to navigation Jump to search
Ganaram inukshuk (talk | contribs)
Added functions to parse numeric pairs
Ganaram inukshuk (talk | contribs)
m testing...?
 
(10 intermediate revisions by 2 users not shown)
Line 8: 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 = '([^' .. delimiter .. ']+)'
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 23: 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 = '([^' .. delimiter .. ']+)'
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 37: 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 = '([^' .. delimiter .. ']+)'
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 52: 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 = '([^' .. delimiter .. ']+)'
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 63: 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 70: Line 75:
-- Helper function
-- Helper function
-- Parses a list of numeric pairs
-- Parses a list of numeric pairs
-- Delimiter between each pair must be a semicolon
-- 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
-- as the intended use is parsing ratios a/b, so input must be formatted as such
function p.parse_numeric_pairs(unparsed, delimiter)
-- "a/b; c/d; e/f"
local delimiter = delimiter or "/"
-- Passing in TRUE for is_fuzzy allows singular values to be parsed as ratios
-- 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], delimiter)
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(pair)
table.insert(pairs_, pair)
end
end
end
end
Line 96: 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
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
end
end
end
end
return pairs_
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
return parsed_me_2
end
end


return p
return p

Latest revision as of 02:35, 24 October 2024

Module documentation[view] [edit] [history] [purge]
Todo: add documentation

local p = {}

-- Helper module for various modules that require entry of multiple labels/values

-- Helper function
-- Parses entries from a delimited string and returns them in an array
-- Default delimiter is semicolon (;)
function p.parse_entries(unparsed, delimiter)
	local parsed = {}
	local delimiter = delimiter or ";"
	local expr = "([^" .. delimiter .. "]+)"
	for entry in string.gmatch(unparsed, expr) do
		local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
		table.insert(parsed, trimmed)		-- Add to array
	end
	return parsed
end

-- Helper function
-- Parses entries from a delimited string and returns them in an array
-- Values entered are convereted into numbers rather than strings.
-- Default delimiter is semicolon (;)
function p.parse_numeric_entries(unparsed, delimiter)
	local parsed = {}
	local delimiter = delimiter or ";"
	local expr = "([^" .. delimiter .. "]+)"
	for entry in string.gmatch(unparsed, expr) do
		local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
		local numeric = tonumber(trimmed)
		table.insert(parsed, numeric)		-- Add to array
	end
	return parsed
end

-- Helper function
-- Parses pairs of values separated by a delimiter; default is colon (:)
function p.parse_pair(unparsed, delimiter)
	local parsed = {}
	local delimiter = delimiter or ":"
	local expr = "([^" .. delimiter .. "]+)"
	for entry in string.gmatch(unparsed, expr) do
		local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
		table.insert(parsed, trimmed)		-- Add to array
	end
	if #parsed == 2 then
		return parsed
	else
		return nil
	end
end

-- Helper function
-- Parses a pair of numeric values
-- 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 delimiter = delimiter or ":"
	local is_fuzzy = is_fuzzy or false
	local expr = "([^" .. delimiter .. "]+)"
	for entry in string.gmatch(unparsed, expr) do
		local trimmed = entry:gsub("^%s*(.-)%s*$", "%1")
		local numeric = tonumber(trimmed)
		table.insert(parsed, numeric)		-- Add to array
	end
	if #parsed == 2 then
		return parsed
	elseif #parsed == 1 and is_fuzzy then
		return { parsed[1], 1 }
	else
		return nil
	end
end

-- Helper function
-- Parses a list of numeric pairs
-- 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
-- as the intended use is parsing ratios a/b, so input must be formatted as such
-- "a/b; c/d; e/f"
-- Passing in TRUE for is_fuzzy allows singular values to be parsed as ratios
-- 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
	local parsed = p.parse_entries(unparsed, delimiter1)
	-- Then tokenize the tokens into numeric pairs
	local pairs_ = {}
	for i = 1, #parsed do
		local pair = p.parse_numeric_pair(parsed[i], delimiter2, is_fuzzy)
		if pair ~= nil and #pair == 2 then
			table.insert(pairs_, pair)
		end
	end
	return pairs_
end

-- Helper function
-- Parses key-value pairs separated by a semicolon
-- Pairs themselves are separated using a colon
function p.parse_kv_pairs(unparsed)
	-- Split the string of unparsed pairs
	local parsed = p.parse_entries(unparsed)
	-- Then tokenize the tokens into key-value pairs
	local pairs_ = {}
	--local num_pairs = 0
	for i = 1, #parsed do
		local pair = p.parse_pair(parsed[i])
		if pair ~= nil and #pair == 2 then
			pairs_[pair[1]] = pair[2]
			--num_pairs = num_pairs + 1
		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
	return parsed_me_2
end

return p