Модуль:Сущность/поля: различия между версиями
Pok (обсуждение | вклад) мНет описания правки Метка: отменено |
Pok (обсуждение | вклад) Нет описания правки |
||
| (не показано 11 промежуточных версий этого же участника) | |||
| Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
local getArgs = require('Module:Arguments').getArgs | |||
local function trim(s) | local function trim(s) | ||
| Строка 11: | Строка 12: | ||
local function split_first_underscore(k) | local function split_first_underscore(k) | ||
local | local pos = k:find('_', 1, true) | ||
return | if not pos or pos == 1 or pos == #k then | ||
return nil, nil | |||
end | |||
return k:sub(1, pos - 1), k:sub(pos + 1) | |||
end | end | ||
local function | local function each_compound_arg(args, fn) | ||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
if type(k) == 'string' and k:find('_', 1, true) then | if type(k) == 'string' and k:find('_', 1, true) then | ||
local base, rem = split_first_underscore(k) | local base, rem = split_first_underscore(k) | ||
if base and rem then | if base and rem then | ||
fn(base, rem, v) | |||
end | end | ||
end | end | ||
end | end | ||
end | |||
local function collect_labels_from_args(args) | |||
local meta = {} | |||
local seen = {} | |||
each_compound_arg(args, function(base, rem) | |||
local label = trim(strip_trailing_digits(rem)) | |||
if label ~= '' then | |||
meta[base] = meta[base] or {} | |||
if not seen[base] then seen[base] = {} end | |||
if not seen[base][label] then | |||
table.insert(meta[base], label) | |||
seen[base][label] = true | |||
end | |||
end | |||
end) | |||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
| Строка 53: | Строка 63: | ||
-- map base -> label -> value | -- map base -> label -> value | ||
local map = {} | local map = {} | ||
each_compound_arg(args, function(base, rem, v) | |||
local lab = trim(strip_trailing_digits(rem)) | |||
map[base] = map[base] or {} | |||
local cur = map[base][lab] | |||
if cur then | |||
map[base][lab] = cur .. '\n' .. tostring(v) | |||
else | |||
map[base][lab] = tostring(v) | |||
end | end | ||
end | end) | ||
if field ~= '' and label ~= '' then | if field ~= '' and label ~= '' then | ||
local base = map[field] | local base = map[field] | ||
if base then return base[label] or '' end | if base then return base[label] or '' end | ||
end | end | ||
if | if field ~= '' and args[field] ~= nil then | ||
return trim(tostring(args[field])) | |||
end | end | ||
| Строка 86: | Строка 87: | ||
function p.main(frame) | function p.main(frame) | ||
local args = frame | local args = getArgs(frame, { removeBlanks = false }) | ||
local field = args[1] | local field = args[1] | ||