მოდული:ვარე თანგილი

ვიკიპედიაშე

შეგიძლიათ შექმნათ დოკუმენტაცია ამ მოდულისათვის: მოდული:ვარე თანგილი/ინფო

local p = {}

local function is_empty(param)
	return param == nil or param == ''
end

local function getTitle(page)
	local success, result = pcall(function()
		local title = mw.title.new(page)
		return { exists = title.exists, isRedirect = title.isRedirect }
	end)
	if success then
		return result
	else
		return nil
	end
end

local function wikilink(title, text, tooltip, lang, style, is_redirect)
	if is_empty(text) then
		text = title
	end
	if not is_empty(lang) and lang ~= 'xmf' then
		title = string.format(':%s:%s', lang, title)
	end
	if lang == 'd' then
		title = title .. '#sitelinks-wikipedia'
	end
	if not is_empty(tooltip) then
		text = string.format('<span title="%s">%s</span>', tooltip, text)
	end
	if not is_empty(style) then
		text = string.format('<span style="%s">%s</span>', style, text)
	end
	if is_redirect then
		return string.format(
			'<span class="plainlinks">[%s %s]</span>',
			tostring(mw.uri.fullUrl(title,'redirect=no')),
			text
		)
	else
		return string.format('[[%s|%s]]', title, text)
	end
end

local categories = {
	['error'] = 'ვიკიპედია:სტატიეფი ჩილათირო გოჭარილი თანგით ვარე თანგილი',
	['outdated'] = 'ვიკიპედია:სტატიეფი ვააქტუალური თანგით ვარე თანგილი',
	['redirect'] = 'ვიკიპედია:ნათანგეფიშ გინოღალაშ თირუაშ მოთხირეფი',
	['unknown'] = 'ვიკიპედია:სტატიეფი უჩინებუ პარამეტრეფით ვარე თანგილი სერიაშ თანგეფს',
	['semiold'] = 'ვიკიპედია:სტატიეფი მოჯვეშებული სინრაქსისით ვარე თანგილი სერიაშ თანგეფს',
	['probably_wrong'] = 'ვიკიპედია:სტატიეფი ორჩანიეთ ჩილათირი პარამეტრეფით ვარე თანგილი სერიაშ თანგეფს ',
	['lang-not-exists'] = 'ვიკიპედია:სტატიეფი თანგით ვარე თანგილი 2, ნამუეფით თანგი ვარე lang-XX',
}

local function throwError(text, category_code, allow_cat)
	local error = require('Module:Error').error
	if category_code and allow_cat then
		return error{text} .. '[[Category:' .. categories[category_code] .. ']]'
	else
		return error{text}
	end
end

function p.main(frame)
	local yesno = require('Module:Yesno')
	local getArgs = require('Module:Arguments').getArgs
	local languages = mw.loadData('Module:Languages/data')
	local prepositional = require('Module:Languages')._transform_lang

	local args = getArgs(frame)

	local categories_list = {}
	local nocat = yesno(args['nocat'])
	local allow_cat = mw.title.getCurrentTitle().namespace == 0 and not nocat
	
	-- გოთანჯუა დო ნამუ თანგი რე "ვარე თანგილი N"
	local mode = tonumber(args['mode'])
	local template_name = 'ვარე თანგილი'
	if mode ~= 1 then
		template_name = template_name .. ' ' .. tostring(mode)
	end
	
	-- проверка не неизвестные параметры
	local redundant_params = {}
	local good_params = {'mode', 1, 2, 3, 4, 'l', 'leave', 'r', 'q', 'nocat'}
	if mode == 2 then
		table.insert(good_params, 5)
		table.insert(good_params, 'text')
		table.insert(good_params, 'текст')
	end
	for k, _ in pairs(args) do
		local is_good_param = false
		for _, v in pairs(good_params) do
		  	if k == v then
		  		is_good_param = true
		  	end
		end
		if not is_good_param then
			table.insert(redundant_params, k)
		end
	end
	if #redundant_params > 0 then
		table.insert(categories_list, 'unknown')
	end

	-- პარამეტრეფიშ მეღება (nocat-შ მოხ)
	local title = args[1]
	local text = args[2]
	local lang = args[3]
	local iw_title = args[4]
	local iw_text = args[5]
	local quotes = yesno(args['q'])
	local addition = args['text'] or args['ტექსტი']
	local leave_always = yesno(args['l']) or yesno(args['leave'])
	local leave_if_redirect = yesno(args['r'])
	
	-- ლადირი პარამეტრეფიშ სითინუეშ გინოჯინა
	if not mw.isSubsting() then
		if is_empty(title) then
			return throwError('სტატიაშ ჯოხო ვარე მეწურაფილი', 'error', allow_cat)
		end
		if title:match('^:[a-z-]+:') then
			return throwError('თანგი ვაუხუჯანს თეჯგურა სინტაქსის', 'semiold', allow_cat)
		end
		if is_empty(lang) and not is_empty(iw_title) and iw_title:match('^[a-z][a-z]$') then
			table.insert(categories_list, 'probably_wrong')
		end
	end
	
	-- პარამეტრეფიშ ოხვილურ მეჯინაშა მოჸონაფა
	if is_empty(text) then
		text = title
	end
	if is_empty(lang) then
		lang = 'en'
	else
		lang = mw.ustring.lower(lang)
	end
	if is_empty(iw_title) then
		iw_title = title
	end
	if is_empty(iw_text) then
		iw_text = iw_title
	end
	
	-- если используется с подстановкой, выбросить почти без обработки
	if mw.isSubsting() then
		local xmf_link = wikilink(title, text)
		if mode == 2 then
			local iw_link = '{{lang-' .. lang .. '|' .. iw_text .. '}}'
			if is_empty(addition) then
				return string.format('%s (%s)', xmf_link, iw_link)
			else
				return string.format('%s (%s; %s)', xmf_link, iw_link,  addition)
			end
		else
			return xmf_link
		end
	end
	
	-- ხასჷლაშ მეღება, თიშ გეშა, ნამჷ-და ქიგებგაქ, ქორე გოჭყაფილი დო ვარი გინოღალირი რენ-და
	local considerAsExists
	local isRedirect
	local considerAsRedirect
	if leave_always then -- ქორე გოჭყაფილი-და |l=1, მუთუნქ ვეგნიჯინინას ოკო, თიშ გეშა, ნამჷ-და ანდაღებული
		considerAsExists = false
		isRedirect = false
		considerAsRedirect = false
	else
		local titleObject = getTitle(title) -- ანდაღებული ფუნქცია, 500 გიმოჭანაფაშ უკული იღაფუ
		if titleObject then
			considerAsExists = titleObject.exists
			isRedirect = titleObject.isRedirect
			considerAsRedirect = isRedirect and not leave_if_redirect
		else -- 500 გიმოჭანაფაშ უკული ვარ-და დო ჯოხოდვალას ჩილათირი სიმბოლეფი ქორე-და
			considerAsExists = false
			isRedirect = false
			considerAsRedirect = false
		end
	end
	
	-- დამუშებული პარამეტრეფიშ სითინუეშ გინოჯინა
	if lang ~= 'd' and languages[lang] == nil then
		return throwError('ჩილათირი ISO-კოდი „' .. lang .. '“', 'error', allow_cat)
	end
	if mode == 2 and lang == 'd' then
		return throwError('თანგი ვარე თანგილი 2 ვაუხუჯანს ვიკიმუნაჩემეფს ნინაშ მანგიორო')
	end
	if mode == 2 and not mw.title.new('Template:Lang-' .. lang).exists then -- ანდაღებული ფუნქცია
		return throwError('ვეგორუ თანგიქ' .. frame:expandTemplate{ title = 'tl', args = { 'lang-' .. lang } },
			'lang-not-exists', allow_cat)
	end
	
	if mode == 5 and considerAsRedirect then
		table.insert(categories_list, 'redirect')
	elseif considerAsExists then
		table.insert(categories_list, 'outdated')
	end
	
	-- გეწურაფეფიშ გორჩქინა ურცხონინამ სტატიაშ რცხუშა
	local iw_tooltip
	local ucfirst_title = mw.getContentLanguage():ucfirst(title)
	if lang == 'd' then
		iw_tooltip = string.format('სტატიაშ „%s“ ელემენტი ვიკიმუნაჩემეფს', ucfirst_title)
	else
		iw_tooltip = string.format('%s — სტატიაშ „%s“ ვერსია გეჸვენჯი ნინაშა: %s', iw_title, ucfirst_title, prepositional(lang))
	end

	-- მაართა ნორთიშ ფორმირაფა - თარი რცხუეფი
	local main_text
	if considerAsExists or mode == 1 or mode == 2 or mode == 5 then
		if lang == 'd' and not considerAsExists then
			local moduleRedLink = require( 'Module:Wikidata/redLink' )
			main_text = moduleRedLink.formatRedLink(title, text, iw_title)
		else
			main_text = wikilink(title, text, nil, nil, nil, isRedirect)
		end
	else
		main_text = wikilink(iw_title, text, iw_tooltip, lang)
	end
	if mode == 4 and quotes then -- TODO: არძა თანგი ვარ-და გოთიშუა
		main_text = '«' .. main_text .. '»'
	end
	
	-- მაჟირა ნორთიშ ფორმირაფა - ნინაში ეშანუეფი
	local post_text = ''
	if not (considerAsExists and not (isRedirect and leave_if_redirect)) or mode == 2 or (mode == 5 and considerAsRedirect) then
		-- თანგიშო "ვარე თანგილი"
		if mode == 1 then
			local lang_text
			if lang == 'd' then
				lang_text = 'd'
			else
				lang_text = languages[lang][1]
			end
			
			local iw_link = wikilink(iw_title, lang_text, iw_tooltip, lang)
			post_text = string.format(
				'<span class="noprint" style="white-space: nowrap; font-size: 85%%;"> (%s)</span>',
				iw_link
			)
		
		-- თანგიშო "ვარე თანგილი 2"
		elseif mode == 2 then
			local iw_link = ''
			if considerAsExists then
				iw_link = frame:expandTemplate{ title = 'lang-' .. lang, args = { iw_text } }
			else
				iw_link = frame:expandTemplate{ title = 'lang-' .. lang, args = { wikilink(iw_title, iw_text, iw_tooltip, lang) } }
			end
			
			if is_empty(addition) then
				post_text = string.format(' (%s)', iw_link)
			else
				post_text = string.format(' (%s; %s)', iw_link,  addition)
			end
		
		-- თანგიშო "ვარე თანგილი 3"
		elseif mode == 3 then
			local ref = string.format(
				'<span style="font-size:95%%; position: relative; top: .4em;">%s</span>',
				frame:expandTemplate{ title = 'ref-' .. lang, args = {} }
			)
			local xmf_link = string.format(
				'<span class="link-xmf metadata" style="font-size:80%%; margin-left:-1.7em; position: relative; top: -.4em;">%s</span>',
				wikilink(title, 'მარგ.')
			)
			post_text = string.format(
				'<span class="noprint" style="white-space: nowrap;">%s%s</span>',
				ref, xmf_link
			)
		
		-- თანგიშო "ვარე თანგილი 4"
		elseif mode == 4 then
			local styles = ''
			if lang == 'fr' then
				styles = 'margin-right:0.3em;'
			elseif lang == 'fi' then
				styles = 'margin-right:0.35em;'
			elseif lang == 'it' then
				styles = 'margin-right:0.5em;'
			end
			
			local xmf _link = string.format(
				'<sup class="noprint" style="margin-left:2px; position:relative; top:-1px;">%s</sup>',
				wikilink(title, 'xmf', 'სტატია „' .. title .. '“ მარგალურ გუმნართის ვა რე')
			)
			local ref = string.format(
				'<sub class="noprint" style="margin-left:-0.94em; %s" title="რცხით სტატიაშ ხემიოჭირინაფუს რე %s">%s</sub>',
				styles, prepositional(lang), lang
			)
			post_text = string.format('%s%s', xmf_link, ref)
		
		-- თანგიშო  "ვარე თანგილი 5"
		else
			post_text = string.format(
				'<sup class="noprint">%s</sup>',
				wikilink(iw_title, '[' .. lang .. ']', iw_tooltip, lang)
			)
		end
	end
	
	if mode == 3 or mode == 4 or mode == 5 then -- TODO: ვარ-და არძაშო?
		post_text = string.format('<span style="font-style:normal; font-weight:normal;">%s</span>', post_text)
	end
	
	-- მასუმა ნორთიშ ფორმირაფა - გინაფა ხასჷლაშ ჸოფაშ გეშა
	local exist_message = ''
	if considerAsExists and not (isRedirect and leave_if_redirect) then
		local exist_message_link
		if mode == 5 then
			if considerAsRedirect then
				exist_message_link = 'თანგი:' .. template_name .. '#ქორე სტატიაშ გინოღალა-და'
			else
				exist_message_link = 'თანგი:' .. template_name .. '#ქორე გოჭყაფილი სტატია-და'
			end
		else
			exist_message_link = 'თანგი:' .. template_name .. '#ქიმინუა ხასლაშ გორჩქინუაშ უკული'
		end
		
		if mode == 5 and considerAsRedirect then
			exist_message = string.format(
				'<sup class="noprint" style="margin:0 0 0 1px;">%s</sup>',
				wikilink(exist_message_link, '*', 'დოთირეთ გინოღალაშ ჯოხო სტატიაშ ჯოხოშა ვარ-და დათხინეთ თანგი „' .. template_name .. '“', nil, 'color:red;')
			)
		else
			exist_message = string.format(
				'<sup class="noprint">%s</sup>',
				wikilink(exist_message_link, '?!', 'დათხინეთ თანგი „' .. template_name .. '“ სტატიაშე დო დოთირეთ უბრალე ვიკი-რცხუთ', nil, 'color:red;')
			)
		end
		
		exist_message = string.format('<span style="font-style:normal; font-weight:bold;">%s</span>', exist_message)
	end
	
	local categories_text = ''
	if allow_cat then
		for _, code in pairs(categories_list) do
			categories_text = categories_text .. '[[Category:' .. categories[code] .. ']]'
		end
	end
	
	local result
	if mode == 2 then
		result = main_text .. exist_message .. post_text .. categories_text
	else
		result = main_text .. post_text .. exist_message .. categories_text
	end
	
	return result
end

return p