Модуль:Шаблон

Материал из ВикиФур
Перейти к: навигация, поиск
-- "Абстрактный" модуль для создания таких шаблонов как Доработка. -- См. Модуль:Доработка 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