「モジュール:Template input parse」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「local p = {} -- Helper module for various modules that require entry of multiple labels/values -- Helper function -- Parses entries from a delimited string and returns…」 |
編集の要約なし |
||
| 62行目: | 62行目: | ||
if pair ~= nil and #pair == 2 then | if pair ~= nil and #pair == 2 then | ||
pairs_[pair[1]] = pair[2] | pairs_[pair[1]] = pair[2] | ||
end | |||
end | |||
return pairs_ | |||
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 | ||
end | end | ||
2026年4月1日 (水) 19:02時点における最新版
このモジュールについての説明文ページを モジュール:Template input parse/doc に作成できます
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 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_ = {}
for i = 1, #parsed do
local pair = p.parse_pair(parsed[i])
if pair ~= nil and #pair == 2 then
pairs_[pair[1]] = pair[2]
end
end
return pairs_
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
return p