مواد ڏانھن هلو

ماڊيول:Hatnote list

کليل ڄاڻ چيڪلي، وڪيپيڊيا مان

وڪي ٽيڪسٽ مان استعمال

[سنواريو]

هي ماڊيول سڌو سنئون وڪي ٽيڪسٽ مان استعمال لاءِ تيار نه ڪيو ويو آهي، جيتوڻيڪ forSee شروعاتي frame آرگومينٽ وٺندو آهي ۽ ممڪن طور وڪي ٽيڪسٽ مان استعمال ٿي سگهي ٿو، مثال طور:

  • {{hatnote|PREFIX {{#invoke:Hatnote list|forSee|{{tl|For}}|Module:For|{{tl|About}}|Module:About}} POSTFIX}}

لوا مان استعمال

[سنواريو]

ماڊيول کي سڏڻ لاءِ استعمال ڪريو:

local mHatList = require('Module:Hatnote list')

يا اهڙو ئي ڪو ٻيو طريقو، پوءِ ان جي طريقن تائين mHatList متغير (يا جيڪو به نالو استعمال ڪيو ويو هجي) ذريعي رسائي حاصل ڪريو.

ائنڊ لسٽ

[سنواريو]

andList ٽيبل جي صورت ۾ هڪ فهرست وٺندو آهي، ۽ مناسب هنڌن تي "and" ۽ ڪاما سان الڳ ڪيل فهرست واري اسٽرنگ واپس ڪندو آهي.

آر لسٽ

[سنواريو]

orList ٽيبل جي صورت ۾ هڪ فهرست وٺندو آهي، ۽ مناسب هنڌن تي "or" ۽ ڪاما سان الڳ ڪيل فهرست واري اسٽرنگ واپس ڪندو آهي.

ڏسڻ لاء

[سنواريو]

_forSee ٽي آرگومينٽ وٺندو آهي: خالي قدرن کان پاڪ ۽ ٽرم ڪيل آرگومينٽن جي ٽيبل، هڪ "from" نمبر جيڪو شروعاتي فھرستبندي طئي ڪري ٿو، ۽ هڪ اختياري جدول؛ ۽ اهو "For X, see [[Y]]" جملن جو اسٽرنگ واپس ڪندو آهي. ڳنڍڻيون ماڊيول:Hatnote جي طريقن ذريعي فارميٽ ڪيون وينديون آهن.

سهولت طور، forSee طريقو (شروعاتي انڊر اسڪور کان سواءِ) ساڳيا آرگومينٽ وٺندو آهي، پر بحث جدول بدران فريم سان، ۽ بحثن کي اڳواٽ روان ڪرڻ لاءِ ماڊيول:Arguments مان getArgs() استعمال ڪندو آهي.


--------------------------------------------------------------------------------
--                           ماڊيول:Hatnote list                              --
--                                                                            --
-- هي ماڊيول هيٽ نوٽس ۾ استعمال لاءِ فهرستون تيار ۽ format ڪري ٿو. خاص طور   --
-- تي، اهو for-see فهرست لاڳو ڪري ٿو، يعني "For X, see Y" وارا جملا،       --
-- جيئن {{about}}، {{redirect}} ۽ انهن جي مختلف صورتن ۾ استعمال ٿيندا آهن. --
-- اضافي طور andList ۽ orList مددگار فنڪشن به شامل آهن، جيڪي انهن          --
-- conjunctions سان فهرستن کي format ڪن ٿا.                                 --
--------------------------------------------------------------------------------

local mArguments -- سست طريقي سان شروعات
local mFormatLink = require('ماڊيول:Format link')
local mHatnote = require('ماڊيول:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}

--------------------------------------------------------------------------------
-- فهرست کي string بڻائڻ وارا مددگار فنڪشن
--
-- اهي فنڪشن فهرستن کي string ۾ بدلائڻ لاءِ استعمال ٿين ٿا، عام طور تي
-- "For X, see Y" وارن for-see items جي "Y" حصي اندر صفحن جي فهرستن لاءِ.
--------------------------------------------------------------------------------

-- فهرست کي string بڻائڻ وارن فنڪشنن ۾ استعمال ٿيندڙ ڊفالٽ options ٽيبل
local stringifyListDefaultOptions = {
	conjunction = "and",
	separator = ",",
	altSeparator = ";",
	space = " ",
	formatted = false
}

-- صرف display text ۾ ڳولها ڪري ٿو
local function searchDisp(haystack, needle)
	return string.find(
		string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
	)
end

-- فهرست کي عام طريقي سان string بڻائي ٿو؛ شايد سڌو استعمال نه ٿيڻ گهرجي
local function stringifyList(list, options)
	-- Type-checks، defaults، ۽ shortcut
	checkType("stringifyList", 1, list, "table")
	if #list == 0 then return nil end
	checkType("stringifyList", 2, options, "table", true)
	options = options or {}
	for k, v in pairs(stringifyListDefaultOptions) do
		if options[k] == nil then options[k] = v end
	end
	local s = options.space

	-- جيڪڏهن درخواست ڪئي وڃي ته فهرست کي format ڪريو
	if options.formatted then
		list = mFormatLink.formatPages(
			{categorizeMissing = mHatnote.missingTargetCat}, list
		)
	end

	-- separator مقرر ڪريو؛ جيڪڏهن ڪو item ان تي مشتمل هجي ته alternate separator استعمال ڪريو
	local separator = options.separator
	for k, v in pairs(list) do
		if searchDisp(v, separator) then
			separator = options.altSeparator
			break
		end
	end

	-- conjunction مقرر ڪريو، Oxford comma لاڳو ڪريو، ۽ جيڪڏهن #1 ۾ "§" هجي ته comma لازمي ڪريو
	local conjunction = s .. options.conjunction .. s
	if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
		conjunction = separator .. conjunction
	end

	-- format ٿيل string واپس ڪريو
	return mw.text.listToText(list, separator .. s, conjunction)
end

-- DRY فنڪشن
function p.conjList (conj, list, fmt)
	return stringifyList(list, {conjunction = conj, formatted = fmt})
end

-- فهرستن کي "and" يا "or" سان string بڻائي ٿو
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end

--------------------------------------------------------------------------------
-- For see
--
-- خام پيراميٽرن مان "For X, see [[Y]]." فهرست تيار ڪري ٿو.
-- {{about}} ۽ {{redirect}} سانچن ۽ انهن جي variants لاءِ ٺاهيو ويو.
--------------------------------------------------------------------------------

-- forSee خاندان جي فنڪشنن ۾ استعمال ٿيندڙ ڊفالٽ options ٽيبل
local forSeeDefaultOptions = {
	andKeyword = 'and',
	title = mw.title.getCurrentTitle().text,
	otherText = 'other uses',
	forSeeForm = 'For %s, see %s.',
}

-- string جي آخر ۾ duplicate punctuation کي collapse ڪري ٿو،
-- italics ۽ links کي نظرانداز ڪندي
local function punctuationCollapse (text)
 	return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
end

-- آرگومينٽن کي stringification ۽ options لاءِ ٽيبل ۾ ترتيب ڏئي ٿو
function p.forSeeArgsToTable (args, from, options)
	-- Type-checks ۽ defaults
	checkType("forSeeArgsToTable", 1, args, 'table')
	checkType("forSeeArgsToTable", 2, from, 'number', true)
	from = from or 1
	checkType("forSeeArgsToTable", 3, options, 'table', true)
	options = options or {}

	for k, v in pairs(forSeeDefaultOptions) do
		if options[k] == nil then options[k] = v end
	end

	-- maxArg هٿ سان حاصل ڪيو ويو آهي ڇو ته getArgs() ۽ table.maxn گڏ نٿا هلن
	local maxArg = 0
	for k, v in pairs(args) do
		if type(k) == 'number' and k > maxArg then maxArg = k end
	end

	-- parameter list مان data کي ترتيب ڏيو:
	-- * forTable wrapper ٽيبل آهي، جنهن ۾ forRow قطارون آهن
	-- * قطارون "use" string ۽ "pages" ٽيبل تي مشتمل آهن
	-- * خالي جڳهون بعد ۾ defaults لاءِ خالي ڇڏيون وڃن ٿيون، پر فهرست ختم به ڪري سگهن ٿيون
	local forTable = {}
	local i = from
	local terminated = false

	-- جيڪڏهن extra text هجي ۽ ڪو آرگومينٽ نه هجي، nil واپس ڪريو
	-- جيئن "For other uses, see foo (disambiguation)" وارو ڊفالٽ پيدا نه ٿئي
	if options.extratext and i > maxArg then return nil end

	-- قطارون تيار ڪرڻ لاءِ loop
	repeat
		-- نئين خالي قطار
		local forRow = {}

		-- جيڪڏهن use خالي هجي، ته فهرست ختم سمجهي loop ختم ڪيو ويندو
		forRow.use = args[i]
		if not args[i] then terminated = true end

		-- صفحن جي نئين خالي فهرست
		forRow.pages = {}

		-- جيڪڏهن موجود هجي ته پهريون صفحو شامل ڪريو
		table.insert(forRow.pages, args[i + 1])

		-- جيڪڏهن ايندڙ پيراميٽر "and" هجي ته اندروني loop ذريعي
		-- وڌيڪ پيراميٽر گڏ ڪريو جيستائين "and" ختم نه ٿين.
		-- خالي قدر نظرانداز ڪيا وڃن ٿا:
		-- "1|and||and|3" → {1, 3}
		while args[i + 2] == options.andKeyword do
			if args[i + 3] then
				table.insert(forRow.pages, args[i + 3])
			end

			-- ايندڙ "and" ڏانهن وڌو
			i = i + 2
		end

		-- ايندڙ use ڏانهن وڌو
		i = i + 2

		-- قطار شامل ڪريو
		table.insert(forTable, forRow)
	until terminated or i > maxArg

	return forTable
end

-- forSeeArgsToTable ذريعي format ٿيل ٽيبل کي string بڻائي ٿو
function p.forSeeTableToString (forSeeTable, options)
	-- Type-checks ۽ defaults
	checkType("forSeeTableToString", 1, forSeeTable, "table", true)
	checkType("forSeeTableToString", 2, options, "table", true)
	options = options or {}

	for k, v in pairs(forSeeDefaultOptions) do
		if options[k] == nil then options[k] = v end
	end

	-- هر for-see item کي فهرست ۾ string بڻايو
	local strList = {}

	if forSeeTable then
		for k, v in pairs(forSeeTable) do
			local useStr = v.use or options.otherText

			local pagesStr =
				p.andList(v.pages, true) or
				mFormatLink._formatLink{
					categorizeMissing = mHatnote.missingTargetCat,
					link = mHatnote.disambiguate(options.title)
				}

			local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
			forSeeStr = punctuationCollapse(forSeeStr)

			table.insert(strList, forSeeStr)
		end
	end

	if options.extratext then
		table.insert(strList, punctuationCollapse(options.extratext..'.'))
	end

	-- گڏيل فهرست واپس ڪريو
	return table.concat(strList, ' ')
end

-- آرگومينٽن مان "For X, see [[Y]]" string پيدا ڪري ٿو.
-- index gaps کي قبول ڪري ٿو پر blank/whitespace values کي نه.
-- named args ۽ "from" کان گهٽ args کي نظرانداز ڪري ٿو.
function p._forSee (args, from, options)
	local forSeeTable = p.forSeeArgsToTable(args, from, options)
	return p.forSeeTableToString(forSeeTable, options)
end

-- _forSee وانگر، پر frame استعمال ڪري ٿو.
function p.forSee (frame, from, options)
	mArguments = require('ماڊيول:Arguments')
	return p._forSee(mArguments.getArgs(frame), from, options)
end

return p