Модуль:Гик-код

Материал из ВикиФур
Перейти к: навигация, поиск
-- Редактирую. --EvilCat local p = {} local d local s = require('Модуль:Работа со строками') local str_replace = s.str_replace local t = require('Модуль:Работа с шаблонами') p.SURVEY_TEMPLATE = 'Шаблон:Гик-код/Инструкция' p.SURVEY_GROUP_TEMPLATE = 'Шаблон:Гик-код/Группа' p.SURVEY_CATEGORY_TEMPLATE = 'Шаблон:Гик-код/Категория' p.SURVEY_MOD_TEMPLATE = 'Шаблон:Гик-код/Модификатор' --[[ Этот модуль берёт в качестве аргумента название гик-кода, для которого должны существовать параметры, заданные в Луа. Он может рисовать следующие отображения: 1. survey: Детальное описание анкеты с инструкцией. С помощью неё пользователь производит Гик-код. 2. decoded: Расшифровку заполненной анкеты (он поставляется в виде аргумента). --]] function p.expand_survey_from_template(frame) return p.expand_survey_from_frame(frame:getParent()) end p["инструкция для шаблона"] = p.expand_survey_from_template function p.expand_survey_from_frame(frame) local result=p.expand_survey(p.code_from_args(frame.args), frame) -- return result return frame:preprocess(result) end p["инструкция для вызова"] = p.expand_survey_from_frame function p.expand_survey_from_console(spec) return p.expand_survey(spec) end function p.code_from_args(args) return args[1] end function p.expand_survey(spec, frame) -- WIP p.load_spec(spec) local args = {} if d.intro then args["справка"] = d.intro end args["группы"] = p.expand_survey_groups(frame) args["название"] = spec return t.expandTemplate(p.SURVEY_TEMPLATE, args, frame) end function p.expand_survey_groups(frame) local expandedGroups = {} for i, v in ipairs(d.groups_order) do table.insert(expandedGroups, p.expand_survey_group(v, frame)) end return table.concat(expandedGroups, "\n") end function p.expand_survey_group(group_key, frame) local args = {} args["название"] = d.category_groups[group_key] args["категории"] = p.expand_survey_categories(group_key, frame) return t.expandTemplate(p.SURVEY_GROUP_TEMPLATE, args, frame) end function p.expand_survey_categories(group_key, frame) local expandedCategories = {} for i, v in ipairs(d.categories) do if v.group == group_key then table.insert(expandedCategories, p.expand_survey_category(v, frame)) end end return table.concat(expandedCategories, "\n") end function p.expand_survey_category(category_data, frame) local args = {} args["обозначение"] = category_data[1] if category_data.short then args["кратко"] = category_data.short end if category_data.hint then args["подсказка"] = category_data.hint end args["вопрос"] = category_data[2] args["модификаторы"] = p.expand_survey_mods(category_data, frame) return t.expandTemplate(p.SURVEY_CATEGORY_TEMPLATE, args, frame) end function p.expand_survey_mods(category_data, frame) local expandedMods = {} for i, v in ipairs(category_data) do if i > 2 then table.insert(expandedMods, p.expand_survey_mod(v, frame)) end end return table.concat(expandedMods, "\n") end function p.expand_survey_mod(mod_data, frame) local args = {} args["описание"] = mod_data[1] if mod_data.comment then args["совет"] = mod_data.comment end args["модификатор"] = mod_data[2] if mod_data.points then args["очки"] = mod_data.points end if mod_data.disqualify then args["дисквалификация"] = 1 end return t.expandTemplate(p.SURVEY_MOD_TEMPLATE, args, frame) end function p.decode_and_autocat(spec, code) return p.decode(spec, code, true) end function p.decode(spec, code, cat) -- WIP p.load_spec(spec) p.map() local categories = mw.text.split(code, ' ', true) local decoded = {} for i, v in ipairs(categories) do local stop = mw.ustring.find(v, '%A') local category = mw.ustring.sub(v, 1, stop - 1) local modifier = mw.ustring.sub(v, stop, #v) if decoded[category] then error('Категория ' .. category .. ' повторяется') end decoded[category] = modifier end end function p.load_spec(spec) if d then return end if not spec then error("Не указана спецификация гик-кода!") end d = require("Модуль:Гик-код/" .. spec) end function p.map() if d.mapped then return end if not d then error("Спецификация не загружена") end d.mapped = {} for i, category_data in ipairs(d.categories) do if d.mapped[category_data[1]] then error("Категория " .. category_data[1] .. " повторяется") end d.mapped[category_data[1]] = category_data category_data.mapped = {} for i2, modifier_data in ipairs(category_data) do if i2 > 2 then local key = modifier_data[2] if not key then key = '' end if category_data.mapped[key] then error("Модификатор " .. key .. " повторяется в категории " .. category_data[1]) end category_data.mapped[key] = modifier_data end end end end return p