Модуль:Example
Цей модуль позначений як К:реліз, готовий до загального вжитку (1). Він досягнув стадії готовності і вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна вживати на допоміжних сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його можна вдосконалювати в рамцях чернеткового тестування, а не з застосуванням спроб і помилок. |
Реалізація шаблону {{приклад}}, див. його документацію.
- Див. також
local p = {}
-- використовується для того, щоб можна було видаляти елементи з таблиці
local function copy(other)
local res = {}
for k,v in pairs(other) do
res[k] = v
end
return res
end
-- виклик шаблону, при помилці повертає порожній рядок
local function expand(frame, tname, targs)
local success, result = pcall(
frame.expandTemplate,
frame,
{title = tname, args = targs}
)
if success then
return result
else
return ''
end
--return frame:expandTemplate({title = tname, args = args})
end
--запобігає обробку вікі-тексту у відображенні зразка
local function nowiki(str)
local res = str
str = mw.text.unstripNoWiki(str)
str = string.gsub(str, '%[', '[')
str = string.gsub(str, '%]', ']')
str = string.gsub(str, '<', '<')
str = string.gsub(str, '>', '>')
str = string.gsub(str, '{', '{')
str = string.gsub(str, '}', '}')
str = string.gsub(str, '\'', ''')
str = string.gsub(str, '"', '"')
str = string.gsub(str, '(https?://)', '<span>%1</span>')
return str
end
--видаляє з параметрів вписані через HTML-сутності "<nowiki>" і замінює "{{=}}" на "=" для виклику шаблону
local function process_nowiki_equals(str)
str = str:gsub('<nowiki>', ''):gsub('</nowiki>', '')
:gsub('<nowiki>', ''):gsub('</nowiki>', '')
:gsub('{{=}}', '=')
:gsub('{{=}}', '=')
:gsub('{{=}}', '=')
:gsub('{{=}}', '=')
:gsub('&', '&')
return str
end
function p.main(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local yesno = require('Module:Yesno')
local args = copy(getArgs(frame, {trim = false, removeBlanks = false})) --copy(frame.args)
local tag = args._tag or 'code'
local container = args._container or nil
local sep = args._sep and args._sep .. ' ' or '→ ' -- за замовчуванням "→"
local link = yesno(args._link, false)
local endl = args._endl or ''
local prefix = args._prefix or args['_pre-text'] or ''
local postfix = args._postfix or args['_post-text'] or ''
local comment_sep = args._comment_sep or ' ' -- передається шаблоном {{стопка прикладів}}, один роздільник на всі приклади
local after = args._after or args._comment or '' -- корисно у шаблоні {{стопка прикладів}} (це просто текст наприкінці)
local before = args._before and args._before .. ' ' or '' -- корисно у шаблоні {{стопка прикладів}}
-- (це просто текст на початку)
local nobr = yesno(args._nobr, false)
local spaced = yesno(args._spaced, false)
local nocat = yesno(args._nocat, false)
local style = args._style
if style == 'pre' then
tag = nil
container = 'pre'
sep = '\n'
elseif style == '*pre' then
tag = nil
container = '*pre'
sep = '\n'
elseif style == 'pre↓' then
tag = nil
container = 'pre'
sep = '<div style="margin:-0.5em 50% 0.7em;"><span style="font-size:150%;">↓</span></div>\n' --вміст шаблону {{sp↓|50%||-0.5em}}
elseif style == '*pre↓' then
tag = nil
container = '*pre'
sep = '<div style="margin:-0.5em 50% 0.7em;"><span style="font-size:150%;">↓</span></div>\n' --вміст шаблону {{sp↓|50%||-0.5em}}
elseif style == 'wikitable' then
tag = 'tt'
sep = '\n|'
comment_sep = '\n|'
end
if (after ~= '') then
after = comment_sep .. after
end
local nwt
if tag then
nwt = mw.html.create(tag):tag(tag) --"no-wiki tag", всередині нього шаблон не викликається
if nobr then
nwt:css('white-space', 'nowrap')
end
end
local content = nowiki(prefix) .. '{{' --для накопичення вмісту тега
local tname = args._template or args[1]
if tname == nil then --якщо назва шаблону містить знак "=" (працює, тільки якщо немає неназваних параметрів)
local nextfunc, static, cur = pairs(args)
local k, v = nextfunc(static, cur)
if k ~= nil and type(k) ~= 'number' and not k:find('^_') then --іменовані параметри, виключаючи модифікатори зовнішнього вигляду
tname = k .. "=" .. v
args[k] = nil --більше цей параметр нам не знадобиться
end
end
if tname == '' or tname == nil then --при опущеному першому параметрі беремо назву шаблону з назви сторінки
tname = mw.language.new('ru'):lcfirst(mw.title.getCurrentTitle().rootText)
end
if args._template == nil then --назва шаблону, що не викликається, у неіменованому першому параметрі (або ж взято з назви сторінки або
--з іменованого параметра за відсутності неіменованих — в наступному рядку шкоди немає в будь-якому випадку),
--більше його обробляти не треба
table.remove(args,1)
end
if link then
content = content .. '[[Шаблон:' .. tname .. '|' .. tname .. ']]'
else
content = content .. tname
end
content = content .. endl
local targs, equals_pos, param, value, left_shift = {}, 0, '', '', 0
for k, v in pairs(args) do
if type(k) == 'number' then --неіменовані параметри
equals_pos = v:find('=')
if equals_pos and v:find('{{=}}') == equals_pos-2 then
equals_pos = nil
end
if equals_pos then --ті, що містять "=" перетворимо в іменовані
param = v:sub(1, equals_pos-1)
value = v:sub(equals_pos+1)
targs[param] = process_nowiki_equals(value)
content = content .. (spaced and ' ' or '') .. '|' .. nowiki(param) .. '=' .. nowiki(value) .. endl
left_shift = left_shift+1 --змінна потрібна, щоб квазінумеровані параметри, що передані через "{{=}}",
--не збивали порядок
else --істинно неіменовані
targs[k - left_shift] = process_nowiki_equals(v)
content = content .. (spaced and ' ' or '') .. '|' .. nowiki(v) .. endl
end
elseif not k:find('^_') then --іменовані параметри, виключаючи модифікатори зовнішнього вигляду
targs[k] = process_nowiki_equals(v)
content = content .. (spaced and ' ' or '') .. '|' .. nowiki(k) .. '=' .. nowiki(v) .. endl
end
end
content = content .. '}}' .. nowiki(postfix)
if container then
local container_args = {}
container_args[1] = content
nwt = expand(frame, container, container_args)
else
nwt:wikitext(content):done()
end
if nocat then
targs['nocat'] = 1
end
expand_result = tostring(expand(frame, tname, targs))
if expand_result:sub(1, 2) == '{|' then
sep = sep .. '\n'
end
return before .. tostring(nwt) .. ' ' .. sep .. prefix .. expand_result .. postfix .. after
end
return p