Модуль:Шаблон
Материал из ВикиФур
-- "Абстрактный" модуль для создания таких шаблонов как Доработка.
-- См. Модуль:Доработка
local p = {}
p.data = false
p.map = false
p.SRC_KEY = '_list'
p.DEFAULT_DATA_SOURCE = false -- override me
local s = require('Модуль:Работа со строками')
p.str_replace = s.str_replace
function p.expand_from_template(frame)
return p.expand_from_frame(frame:getParent())
end
p['шаблон'] = p.expand_from_template
function p.expand_from_frame(frame)
local result = p.expand(p.list_from_args(frame.args), true)
-- return result
return frame:preprocess(result)
end
function p.test(frame)
p.load_data(frame.args[p.SRC_KEY])
return p.expand_all(frame)
end
p['проверка'] = p.test
function p.expand_all(frame)
local result = p.expand(p.normalize_list(p.list_all()), false)
-- return result
return frame:preprocess(result)
end
p['всё'] = p.expand_all
function p.expand_from_console(list)
list = p.list_from_args(list)
return p.expand(list, true)
end
function p.list_all(src)
p.load_data(src)
p.map_data()
local list = {}
for i, v in pairs(p.data.list) do
table.insert(list, p.normal_code(i))
end
return list
end
function p.list_from_args(args)
p.load_data(args[p.SRC_KEY])
p.map_data()
local list={}, code
for i, v in ipairs(args) do
table.insert(list, p.normal_code(v))
end
for i, v in pairs(args) do
if not p.is_special_argument(i) and not string.match(i, '^%d+$') then
table.insert(list, p.normal_code(i))
end
end
list = p.normalize_list(list)
return list
end
function p.is_special_argument(name)
return name == p.SRC_KEY
end
function p.normalize_list(list)
p.map_data()
local code
local normal_list = {}
local used = {}
for i, v in ipairs(list) do
code = v
if p.map[code] and not used[code] then
table.insert(normal_list, p.data.list[p.map[code]])
used[code] = true
end
end
return normal_list
end
function p.normal_code(code)
-- не учитывается заглавное/мелкое написание, пробелы, подчёркивания, дефисы
local res = mw.ustring.lower(code)
res = p.str_replace(res, ' ', '')
res = p.str_replace(res, '_', '')
res = p.str_replace(res, '-', '')
return res
end
function p.load_data(src)
if p.data then return end
if not src then src = p.DEFAULT_DATA_SOURCE end
if src == false then error() end
p.data = require(src)
end
function p.map_data()
p.load_data()
if p.map ~= false then return end
p.map = {}
for i, v in pairs(p.data.list) do
p.map[p.normal_code(i)]=i
if v.title then p.map[p.normal_code(v.title)] = i end
if v.syns then
for i2, syn in pairs(v.syns) do
p.map[p.normal_code(syn)] = i
end
end
end
end
function p.expand(list, production)
error() -- override me
end
return p