Модуль:Template call code: различия между версиями

Материал из Тептар — свободной энциклопедии
Перейти к навигации Перейти к поиску
(Керла агӀо: «local getArgs = require('Module:Arguments').getArgs local ce = mw.language.new('ce') local p = {} -- Лело йеза хIара гуран чура цхьа йолу...»)
 
Нет описания правки
Строка 1: Строка 1:
local getArgs = require('Module:Arguments').getArgs
local getArgs = require('Module:Arguments').getArgs
local ce = mw.language.new('ce')
local ru = mw.language.new('ru')


local p = {}
local p = {}


-- Лело йеза хIара гуран чура цхьа йолу хIумна дIайаха
-- Используется для того, чтобы можно было удалять элементы из таблицы
local function copy(other)
local function copy(other)
local res = {}
local res = {}
Строка 29: Строка 29:
table.remove(args, 1)
table.remove(args, 1)
-- Ишта цхьа йерш «=» дуьхьарлера барамца
-- Вещи типа «=» в первом параметре
if not name then
if not name then
for k, v in pairs(args) do
for k, v in pairs(args) do
Строка 63: Строка 63:
if name then
if name then
local trimmedName = mw.text.trim(name)
local trimmedName = mw.text.trim(name)
if ce:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
flags.subst = true
flags.subst = true
name = mw.ustring.sub(trimmedName, 7)
name = mw.ustring.sub(trimmedName, 7)
end
end
if ce:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'бухе:' then
if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'подст:' then
flags.podst = true
flags.podst = true
name = mw.ustring.sub(trimmedName, 7)
name = mw.ustring.sub(trimmedName, 7)
Строка 87: Строка 87:
local currentTitle = mw.title.getCurrentTitle()
local currentTitle = mw.title.getCurrentTitle()
-- Цхьаболу охьабаитина барамца схьаоьца кепа цIе агIон цIарах
-- При опущенном первом параметре берём имя шаблона из названия страницы
if name == '' or not name then
if name == '' or not name then
local currentTitleRoot = currentTitle.rootText
local currentTitleRoot = currentTitle.rootText
if not flags.ucFirst and
if not flags.ucFirst and
((ce:uc(currentTitleRoot) ~= currentTitleRoot and
((ru:uc(currentTitleRoot) ~= currentTitleRoot and
-- Канига:ЛиттинатIурах йогIуш йу, TranslateDate
-- Книга:Литературное наследство, TranslateDate
not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
) or
) or
Строка 98: Строка 98:
)
)
then
then
name = ce:lcfirst(currentTitleRoot)
name = ru:lcfirst(currentTitleRoot)
else
else
name = currentTitleRoot
name = currentTitleRoot
Строка 106: Строка 106:
local global = flags.global or mw.ustring.sub(name, 1, 1) == ':'
local global = flags.global or mw.ustring.sub(name, 1, 1) == ':'
-- Ишар схьалахьо дуьлало вай
-- Начинаем собирать код
local linkBody, titleObject, linkBegin, linkDivider, linkEnd
local linkBody, titleObject, linkBegin, linkDivider, linkEnd
Строка 169: Строка 169:
text = text .. 'subst:'
text = text .. 'subst:'
elseif flags.podst then
elseif flags.podst then
text = text .. 'бухе:'
text = text .. 'подст:'
end
end
if not flags.black then
if not flags.black then
Строка 177: Строка 177:
local commentedLabel
local commentedLabel
if args.comment then
if args.comment then
-- https://massarna.com/w/T200704
-- https://phabricator.wikimedia.org/T200704
-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(args.text or name), args.comment}})
-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(args.text or name), args.comment}})
commentedLabel = '<span class="commentedText" title="' .. args.comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..
commentedLabel = '<span class="commentedText" title="' .. args.comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..
Строка 239: Строка 239:
for k, v in pairs(args) do
for k, v in pairs(args) do
if type(k) == 'number' then  -- ЦIетеханза барамаш
if type(k) == 'number' then  -- Неименованные параметры
equals_pos = v:find('=')
equals_pos = v:find('=')
if equals_pos and v:find('{{=}}') == equals_pos - 2 then
if equals_pos and v:find('{{=}}') == equals_pos - 2 then
equals_pos = nil
equals_pos = nil
end
end
if equals_pos then  -- Чулацам «=» цIетехначера йар
if equals_pos then  -- Содержащие «=» преобразуем в именованные
param = v:sub(1, equals_pos - 1)
param = v:sub(1, equals_pos - 1)
value = v:sub(equals_pos + 1)
value = v:sub(equals_pos + 1)
addPipe()
addPipe()
text = text .. param .. '=' .. value
text = text .. param .. '=' .. value
else  -- Бакъалла цIетехна йоцурш
else  -- Истинно неименованные
addPipe()
addPipe()
text = text .. v
text = text .. v
end
end
elseif not k:find('^_') then  -- ЦIетехана болу барамаш, арахьара хийцам бираш дIадахарца
elseif not k:find('^_') then  -- Именованные параметры, исключая модификаторы внешнего вида
addPipe()
addPipe()
text = text .. k .. '=' .. v
text = text .. k .. '=' .. v
Строка 268: Строка 268:
table.remove(args, 1)
table.remove(args, 1)
-- Цхьа йолу хIумнаш ишта «=» дуьхьаралера барамца
-- Вещи типа «=» в первом параметре
if not name then
if not name then
for k, v in pairs(args) do
for k, v in pairs(args) do
Строка 281: Строка 281:
local optpText
local optpText
if name then
if name then
local spanOffset = mw.ustring.find(name, '<span')  -- Кхин кеп лелор optp
local spanOffset = mw.ustring.find(name, '<span')  -- След использования шаблона optp
if spanOffset then
if spanOffset then
optpText = mw.ustring.sub(name, spanOffset)
optpText = mw.ustring.sub(name, spanOffset)
Строка 324: Строка 324:
if name then
if name then
local trimmedName = mw.text.trim(name)
local trimmedName = mw.text.trim(name)
if ce:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
subst = true
subst = true
name = mw.ustring.sub(trimmedName, 7)
name = mw.ustring.sub(trimmedName, 7)
end
end
if ce:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'бухе:' then
if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'подст:' then
podst = true
podst = true
name = mw.ustring.sub(trimmedName, 7)
name = mw.ustring.sub(trimmedName, 7)
Строка 335: Строка 335:
local currentTitle = mw.title.getCurrentTitle()
local currentTitle = mw.title.getCurrentTitle()
-- Цхьаболу охьабаитина барамца схьаоьца кепа цIе агIон цIарах
-- При опущенном первом параметре берём имя шаблона из названия страницы
if name == '' or not name then
if name == '' or not name then
local currentTitleRoot = currentTitle.rootText
local currentTitleRoot = currentTitle.rootText
if not ucFirst and
if not ucFirst and
((ce:uc(currentTitleRoot) ~= currentTitleRoot and
((ru:uc(currentTitleRoot) ~= currentTitleRoot and
-- Книга:Литературное наследство, TranslateDate
-- Книга:Литературное наследство, TranslateDate
not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
Строка 346: Строка 346:
)
)
then
then
name = ce:lcfirst(currentTitleRoot)
name = ru:lcfirst(currentTitleRoot)
else
else
name = currentTitleRoot
name = currentTitleRoot
Строка 352: Строка 352:
end
end
-- Ишар лахьо дуьлало вай
-- Начинаем собирать код
local linkBody, titleObject, linkBegin, linkDivider, linkEnd
local linkBody, titleObject, linkBegin, linkDivider, linkEnd
Строка 424: Строка 424:
text = text .. 'subst:'
text = text .. 'subst:'
elseif podst then
elseif podst then
text = text .. 'бухе:'
text = text .. 'подст:'
end
end
if not black then
if not black then
Строка 436: Строка 436:
local commentedLabel
local commentedLabel
if comment then
if comment then
-- https://massarna.com/w/T200704
-- https://phabricator.wikimedia.org/T200704
-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(text or name), comment}})
-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(text or name), comment}})
commentedLabel = '<span class="commentedText" title="' .. comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..
commentedLabel = '<span class="commentedText" title="' .. comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..

Версия от 10:38, 18 июня 2020

Модуль используется в:

См. также


local getArgs = require('Module:Arguments').getArgs
local ru = mw.language.new('ru')

local p = {}

-- Используется для того, чтобы можно было удалять элементы из таблицы
local function copy(other)
	local res = {}
	for k, v in pairs(other) do
		res[k] = v
	end
	return res
end

local function makeInvokeFunc(funcName)
	return function (frame)
		local args = copy(getArgs(frame, {
			trim = false,
			removeBlanks = false
		}))
		return p[funcName](args)
	end
end

p.withoutParams = makeInvokeFunc('_withoutParams')

function p._withoutParams(args)
	local name = args[1]
	table.remove(args, 1)
	
	-- Вещи типа «=» в первом параметре
	if not name then
		for k, v in pairs(args) do
			if not k:find('^_') then
				name = k .. '=' .. v
				args[k] = nil
				break
			end
		end
	end
	
	local flags = {}
	for i, v in ipairs(args) do
		if v == 'nl' or v == 'nolink' then
			flags.noLink = true
		elseif v == 's' then
			flags.subst = true
		elseif v == 'п' then
			flags.podst = true
		elseif v == 'g' then
			flags.global = true
		elseif v == 'nav' then
			flags.nav = true
		elseif v == 'noredir' then
			flags.noRedirect = true
		elseif v == 'u' then
			flags.ucFirst = true
		elseif v == 'b' then
			flags.black = true
		end
	end
	
	if name then
		local trimmedName = mw.text.trim(name)
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
			flags.subst = true
			name = mw.ustring.sub(trimmedName, 7)
		end
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'подст:' then
			flags.podst = true
			name = mw.ustring.sub(trimmedName, 7)
		end
	end
	
	if args.text == '' then
		args.text = nil
	end
	if args.comment == '' then
		args.comment = nil
	end
	if args.lang == '' then
		args.lang = nil
	end
	if args.sister == '' then
		args.sister = nil
	end
	
	local currentTitle = mw.title.getCurrentTitle()
	-- При опущенном первом параметре берём имя шаблона из названия страницы
	if name == '' or not name then
		local currentTitleRoot = currentTitle.rootText
		if not flags.ucFirst and
			((ru:uc(currentTitleRoot) ~= currentTitleRoot and
				-- Книга:Литературное наследство, TranslateDate
				not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
			) or
				#currentTitleRoot == 1
			)
		then
			name = ru:lcfirst(currentTitleRoot)
		else
			name = currentTitleRoot
		end
	end
	
	local global = flags.global or mw.ustring.sub(name, 1, 1) == ':'
	
	-- Начинаем собирать код
	local linkBody, titleObject, linkBegin, linkDivider, linkEnd
	
	local prefixes = {}
	if args.lang then
		table.insert(prefixes, args.lang)
	end
	if args.sister then
		table.insert(prefixes, args.sister)
	end
	linkBody = table.concat(prefixes, ':')
	
	if #linkBody ~= 0 then
		linkBody = ':' .. linkBody
	end
	if mw.ustring.sub(name, 1, 1) ~= ':' then
		linkBody = linkBody .. ':'
	end
	if not global then
		linkBody = linkBody .. 'Template:'
	end
	linkBody = linkBody .. name
	titleObject = mw.title.new(linkBody)
	
	local noLink = flags.noLink or currentTitle == titleObject
	local takeBracketsInLink = not noLink and
		mw.ustring.len(name) == 1 and
		not flags.black and
		not flags.subst and
		not flags.podst
	
	if not noLink then
		if not flags.noRedirect or (
			flags.noRedirect and
			not args.lang and
			not args.sister and
			not titleObject.exists
		) then
			linkBegin = '[['
			linkEnd = ']]'
			linkDivider = '|'
		else
			linkBegin = '['
			linkEnd = ']'
			linkDivider = ' '
			linkBody = titleObject:fullUrl('redirect=no')
		end
	end
	
	local text = ''
	if flags.nav and currentTitle == titleObject then
		text = text .. '\'\'\''
	end
	if not flags.black then
		text = text .. '<span class="wp-templatelink">'
	end
	text = text .. '{'
	if not takeBracketsInLink then
		text = text .. '{'
	end
	if flags.subst then
		text = text .. 'subst:'
	elseif flags.podst then
		text = text .. 'подст:'
	end
	if not flags.black then
		text = text .. '</span>'
	end
	
	local commentedLabel
	if args.comment then
		-- https://phabricator.wikimedia.org/T200704
		-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(args.text or name), args.comment}})
		commentedLabel = '<span class="commentedText" title="' .. args.comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..
			(args.text or name) ..
			'</span>'
	end
	local label = (commentedLabel or args.text or name)
	if not noLink then
		if flags.noRedirect then
			text = text .. '<span class="plainlinks">'
		end
		text = text .. linkBegin .. linkBody .. linkDivider
		if not noLink and takeBracketsInLink then
			text = text .. '<span class="wp-templatelink">{</span>'
		end
		text = text .. label
		if not noLink and takeBracketsInLink then
			text = text .. '<span class="wp-templatelink">}</span>'
		end
		text = text .. linkEnd
		if flags.noRedirect then
			text = text .. '</span>'
		end
	else
		text = text .. label
	end
	
	if not flags.black then
		text = text .. '<span class="wp-templatelink">'
	end
	text = text .. '}'
	if not takeBracketsInLink then
		text = text .. '}'
	end
	if not flags.black then
		text = text .. '</span>'
	end
	if flags.nav and currentTitle == titleObject then
		text = text .. '\'\'\''
	end
	
	return text
end

function addParams(args, params)
	local text, equals_pos, param, value = '', 0, '', ''
	
	function addPipe()
		if params.spaced then
			text = text .. ' '
		end
		text = text .. '<span'
		if not params.black then
			text = text .. ' class="wp-templatelink"'
		end
		if not params.spaced then
			text = text .. ' style="margin:0 2px;"'
		end
		text = text .. '>&#124;</span>'
	end
	
	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)
				addPipe()
				text = text .. param .. '=' .. value
			else  -- Истинно неименованные
				addPipe()
				text = text .. v
			end
		elseif not k:find('^_') then  -- Именованные параметры, исключая модификаторы внешнего вида
			addPipe()
			text = text .. k .. '=' .. v
		end
	end
	
	return text
end

p.withParams = makeInvokeFunc('_withParams')

function p._withParams(args)
	local name = args[1]
	table.remove(args, 1)
	
	-- Вещи типа «=» в первом параметре
	if not name then
		for k, v in pairs(args) do
			if not k:find('^_') then
				name = k .. '=' .. v
				args[k] = nil
				break
			end
		end
	end
	
	local optpText
	if name then
		local spanOffset = mw.ustring.find(name, '<span')  -- След использования шаблона optp
		if spanOffset then
			optpText = mw.ustring.sub(name, spanOffset)
			name = mw.ustring.sub(name, 1, spanOffset - 1)
		end
	end
	
	local yesno = require('Module:Yesno')
	
	local nobr = yesno(args._nobr, false)
	local tag = args._tag or 'span'
	local style = args._style
	local spaced = yesno(args._spaced, false)
	local subst = yesno(args._s, false)
	local podst = yesno(args['_п'], false)
	local global = yesno(args._g, false) or name and mw.ustring.sub(name, 1, 1) == ':'
	local lang = args._lang
	local sister = args._sister
	local nav = yesno(args._nav, false)
	local ucFirst = yesno(args._u, false)
	local black = yesno(args._b, false) or tag ~= 'span'
	local noLink = yesno(args._nolink or args._nl, false) or not yesno(args._link, false)
	local textInPlaceOfName = args._text
	local comment = args._comment
	local noRedirect = yesno(args._noredir, false)
	local prefix = args._prefix
	local postfix = args._postfix
	
	if textInPlaceOfName == '' then
		textInPlaceOfName = nil
	end
	if comment == '' then
		comment = nil
	end
	if lang == '' then
		lang = nil
	end
	if sister == '' then
		sister = nil
	end
	
	if name then
		local trimmedName = mw.text.trim(name)
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'subst:' then
			subst = true
			name = mw.ustring.sub(trimmedName, 7)
		end
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == 'подст:' then
			podst = true
			name = mw.ustring.sub(trimmedName, 7)
		end
	end
	
	local currentTitle = mw.title.getCurrentTitle()
	-- При опущенном первом параметре берём имя шаблона из названия страницы
	if name == '' or not name then
		local currentTitleRoot = currentTitle.rootText
		if not ucFirst and
			((ru:uc(currentTitleRoot) ~= currentTitleRoot and
				-- Книга:Литературное наследство, TranslateDate
				not mw.ustring.match(currentTitleRoot, '^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]')
			) or
				#currentTitleRoot == 1
			)
		then
			name = ru:lcfirst(currentTitleRoot)
		else
			name = currentTitleRoot
		end
	end
	
	-- Начинаем собирать код
	local linkBody, titleObject, linkBegin, linkDivider, linkEnd
	
	local prefixes = {}
	if lang then
		table.insert(prefixes, lang)
	end
	if sister then
		table.insert(prefixes, sister)
	end
	linkBody = table.concat(prefixes, ':')
	
	if #linkBody ~= 0 then
		linkBody = ':' .. linkBody
	end
	if mw.ustring.sub(name, 1, 1) ~= ':' then
		linkBody = linkBody .. ':'
	end
	if not global then
		linkBody = linkBody .. 'Template:'
	end
	linkBody = linkBody .. name
	titleObject = mw.title.new(linkBody)
	
	local noLink = noLink or currentTitle == titleObject
	local takeBracketsInLink = not noLink and
		mw.ustring.len(name) == 1 and
		not black and
		not subst and
		not podst
	
	if not noLink then
		if not noRedirect or (
			noRedirect and
			not lang and
			not sister and
			not titleObject.exists
		) then
			linkBegin = '[['
			linkEnd = ']]'
			linkDivider = '|'
		else
			linkBegin = '['
			linkEnd = ']'
			linkDivider = ' '
			linkBody = titleObject:fullUrl('redirect=no')
		end
	end
	
	local text = ''
	if tag then
		text = text .. '<' .. tag .. ' class="templateCallCode'
		if nobr then
			text = text .. ' nowrap'
		end
		text = text .. '"'
		if style then
			text = text .. ' style="' .. style .. '"'
		end
		text = text .. '>'
	end
	if prefix then
		text = text .. prefix
	end
	
	if not black then
		text = text .. '<span class="wp-templatelink">'
	end
	text = text .. '{{'
	if subst then
		text = text .. 'subst:'
	elseif podst then
		text = text .. 'подст:'
	end
	if not black then
		text = text .. '</span>'
	end
	
	if nav and currentTitle == titleObject then
		text = text .. '\'\'\''
	end
	
	local commentedLabel
	if comment then
		-- https://phabricator.wikimedia.org/T200704
		-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = 'comment', args = {(text or name), comment}})
		commentedLabel = '<span class="commentedText" title="' .. comment .. '" style="border-bottom: 1px dotted; cursor: help;">' ..
			(textInPlaceOfName or name) ..
			'</span>'
	end
	local label = (commentedLabel or textInPlaceOfName or name)
	if not noLink then
		if noRedirect then
			text = text .. '<span class="plainlinks">'
		end
		text = text .. linkBegin .. linkBody .. linkDivider .. label .. linkEnd
		if noRedirect then
			text = text .. '</span>'
		end
	else
		text = text .. label
	end
	
	if nav and currentTitle == titleObject then
		text = text .. '\'\'\''
	end
	
	if optpText then
		text = text .. optpText
	end
	
	text = text .. addParams(args, {
		spaced = spaced,
		black = black,
	})
	
	if spaced then
		text = text .. ' '
	end
	
	if not black then
		text = text .. '<span class="wp-templatelink">'
	end
	text = text .. '}}'
	if not black then
		text = text .. '</span>'
	end
	
	if postfix then
		text = text .. postfix
	end
	if tag then
		text = text .. '</' .. tag .. '>'
	end
	
	return text
end

p.onlyParams = makeInvokeFunc('_onlyParams')

function p._onlyParams(args)
	local span = mw.html.create('span')
	span:css( 'color', mw.getCurrentFrame():expandTemplate({ title = 'optp/color' }) )
	
	local yesno = require('Module:Yesno')
	
	span:wikitext(addParams(args, {
		spaced = yesno(args._spaced, false),
		black = true,
	}))

	return tostring(span)
end

return p