Перайсьці да зьместу

Модуль:Іншае значэньне

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі
--------------------------------------------------------------------------------
--                              Модуль:Іншае значэньне                               --
--                                                                            --
-- Гэты модуль стварае спасылкі ўверсе старонкі (верхнія спасылкі/hatnotes) і спасылкі на падобныя артыкулы. Ён --
-- рэалізуе меташаблёны {{Верхняя зноска}} і {{Фармат спасылкі}} і ўключае --
-- дапаможныя функцыі для іншых модуляў верхніх зносак (ВЗ) Lua.                           --
--------------------------------------------------------------------------------

local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- лянівая ініцыялізацыя [[Модуль:Аргумэнты]]
local yesno -- лянівая ініцыялізацыя [[Модуль:ТакНе]]
local formatLink -- лянівая ініцыялізацыя [[Модуль:Фармат спасылкі]] ._formatLink

local p = {}

--------------------------------------------------------------------------------
-- Дапаможныя функцыі
--------------------------------------------------------------------------------

local function getArgs(frame)
	-- Атрымлівае аргументы з бацькоўскага фрэйма. Прагалы ачышчаюцца й
	-- выдаляюцца.
	mArguments = require('Модуль:Аргумэнты')
	return mArguments.getArgs(frame, {parentOnly = true})
end

local function removeInitialColon(s)
	-- Выдаляе пачатковае двукроп’е з радка, калі яно ёсьць.
	return s:match('^:?(.*)')
end

function p.defaultClasses(inline)
	-- Забясьпечвае дапомныя клясы ВЗ ў выглядзе радка, падзеленага прагаламі; карысна
	-- для модуляў, якія маніпулююць ВЗ, напрыклад [[Модуль:Група верхніх зносак]].
	return
		(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
		'navigation-not-searchable'
end

function p.disambiguate(page, disambiguator)
	-- Фарматуе старонку ў загаловак зь неадназначнасьцю ў дужках,
	-- напрыклад «Прыклад» → «Прыклад (неадназначнасьць)».
	checkType('disambiguate', 1, page, 'string')
	checkType('disambiguate', 2, disambiguator, 'string', true)
	disambiguator = disambiguator or 'неадназначнасьць'
	return mw.ustring.format('%s (%s)', page, disambiguator)
end

function p.findNamespaceId(link, removeColon)
	-- Знаходзіць ідэнтыфікатар прасторы назваў (нумар прасторы назваў) спасылкі або назвы старонкі. Гэта
	-- функцыя ня будзе працаваць, калі спасылка ўзятая ў падвойныя дужкі. Двукроп’і
	-- дапомна абрэзваюцца з пачатку спасылкі. Каб прапусьціць абрэзку двукроп’я
	-- ўсталюйце парамэтар removeColon у значэньне false.
	checkType('findNamespaceId', 1, link, 'string')
	checkType('findNamespaceId', 2, removeColon, 'boolean', true)
	if removeColon ~= false then
		link = removeInitialColon(link)
	end
	local namespace = link:match('^(.-):')
	if namespace then
		local nsTable = mw.site.namespaces[namespace]
		if nsTable then
			return nsTable.id
		end
	end
	return 0
end

function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
	-- Фарматуе паведамленьне пра памылку, якое будзе вярнутае ў вікітэкст. Калі
	-- addTrackingCategory не false пасьля вяртаньня з
	-- [[Модуль:ТакНе]], і калі мы не на старонцы абмеркаваньня, катэгорыя адсочваньня
	-- дадаецца.
	checkType('makeWikitextError', 1, msg, 'string')
	checkType('makeWikitextError', 2, helpLink, 'string', true)
	yesno = require('Модуль:ТакНе')
	title = title or mw.title.getCurrentTitle()
	-- Стварае спасылку на даведку.
	local helpText
	if helpLink then
		helpText = ' ([[' .. helpLink .. '|дапамога]])'
	else
		helpText = ''
	end
	-- Стварае тэкст катэгорыі.
	local category
	if not title.isTalkPage -- Не катэгарызуем абмеркаваньні
		and title.namespace ~= 2 -- Не катэгарызуем старонкі ўдзельнікаў
		and yesno(addTrackingCategory) ~= false -- Магчымасьць адключэньня
	then
		category = 'Вікіпэдыя:Праблема ў парамэтрах шаблёнаў'
		category = mw.ustring.format(
			'[[%s:%s]]',
			mw.site.namespaces[14].name,
			category
		)
	else
		category = ''
	end
	return mw.ustring.format(
		'<strong class="error">Памылка: %s%s.</strong>%s',
		msg,
		helpText,
		category
	)
end

local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
	--Адсутная дапомная мэтавая катэгорыя, экспартаваная для выкарыстання ў зьвязаных модулях
	((curNs ==  0) or (curNs == 14)) and
	'Вікіпэдыя:Артыкулы з шаблёнамі верхніх зносак, якія спасылаюцца на няісныя старонкі' or nil

function p.quote(title)
    -- Вызначаем табліцу двукосьсяў, якія трэба выдаліць
    local quotationMarks = {
        ["'"] = true, 
        ['"'] = true, 
        ['"'] = true, 
        ["'"] = true, 
        ['"'] = true, 
        ["'"] = true,
        ['«'] = true,
        ['»'] = true
    }
    
    -- Абрэзаем прагалы ў пачатку і ў канцы
    title = mw.text.trim(title)
    
    -- Правяраем і прыбіраем двукосьсі ў пачатку
    local firstChar = string.sub(title, 1, 1)
    if quotationMarks[firstChar] then
        title = string.sub(title, 2)
    end
    
    -- Правяраем і прыбіраем двукосьсі ў канцы
    local lastChar = string.sub(title, -1, -1)
    if quotationMarks[lastChar] then
        title = string.sub(title, 1, -2)
    end
    
    -- Зноўку абрэзаем прагалы па выдаленьні двукосьсяў
    title = mw.text.trim(title)
    
    -- Выкарыстоўваем толькі двукосьсі « і » ([[ВП:ПАФ]])
    return '«' .. title .. '»'
end

--------------------------------------------------------------------------------
-- Верхняя зноска
--
-- Стварае стандарты тэкст ВЗ. Апрацоўвае шаблён {{Верхняя зноска}}.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Шаблён:Верхняя зноска" }) end

function p.hatnote(frame)
	local args = getArgs(frame)
	local s = args[1]
	if not s then
		return p.makeWikitextError(
			'тэкст ня вызначаны',
			'Шаблён: Іншае значэньне#Памылкі',
			args.category
		)
	end
	return p._hatnote(s, {
		extraclasses = args.extraclasses,
		selfref = args.selfref
	})
end

function p._hatnote(s, options)
	checkType('_hatnote', 1, s, 'string')
	checkType('_hatnote', 2, options, 'table', true)
	options = options or {}
	local inline = options.inline
	local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
	local extraclasses
	if type(options.extraclasses) == 'string' then
		extraclasses = options.extraclasses
	end

	hatnote
		:attr('role', 'note')
		:addClass(p.defaultClasses(inline))
		:addClass(extraclasses)
		:addClass(options.selfref and 'selfref' or nil)
		:wikitext(s)

	return mw.getCurrentFrame():extensionTag{
		name = 'templatestyles', args = { src = 'Module:Іншае значэньне/styles.css' }
	} .. tostring(hatnote)
end

return p