মডিউল:উর্ধ্বটীকা গ্রুপ
একাধিক হ্যাটনোটকে একটি গোষ্ঠীবদ্ধ হ্যাটনোটে একত্রিত করার জন্য, {{উর্ধ্বটীকা গ্রুপ}} প্রয়োগ করে।
প্রযুক্তিগত বিবরণ
সম্পাদনামডিউল প্রতিটি উর্ধ্বটীকা-সুদর্শন div
উপাদান খুঁজে বের করার চেষ্টা করে, এবং একটি বড়, জেনেরিক উর্ধ্বটীকায় মোড়ানো স্থান-বিচ্ছিন্ন span
উপাদানগুলিতে একত্রিত করে।
প্রথমত, এটি তার ইনপুট টেক্সটে "উর্ধ্বটীকার মতো দেখতে" প্রতিটি প্যাটার্নের সাথে মেলে; এখানেই বেশিরভাগ সমস্যার উদ্ভব হতে পারে কারণ প্যাটার্নটি উর্ধ্বটীকার আকারে যে কোনও পার্থক্যের জন্য মোটামুটি সংবেদনশীল।
প্রতিটি প্যাটার্নের মিল থেকে, এটি একটি টেবিল তৈরি করে। টেবিলের প্রতিটি উপাদান ("সারি") একটি আসল হ্যাটনোটের সাথে মিলে যায়, এবং এটি একটি টেবিল যাতে হ্যাটনোটের রেন্ডার করা অভ্যন্তরীণ বিষয়বস্তুর সাথে একটি স্ট্রিং থাকে এবং সেই উর্ধ্বটীকার সাথে সম্পর্কিত যেকোন "অতিরিক্ত" ক্লাস ধারণকারী একটি অভ্যন্তরীণ টেবিল থাকে (যেমন < code>selfreference একটি {{self reference}} উর্ধ্বটীকা থেকে, অথবা {{hatnote}}-এর extraclasses
প্যারামিটার থেকে যেকোনো ক্লাস)।
উর্ধ্বটীকা div
এলিমেন্টের বাইরে উপস্থিত থাকলে এটি আলাদাভাবে সমস্ত বিভাগগুলির জন্যও খোঁজ করে এবং সেগুলিকে নিশ্চিত করতে সমস্ত "আলগা বিভাগ" এর একটি সংযুক্ত স্ট্রিংয়ে যুক্ত করে। ঘটনাক্রমে উর্ধ্বটীকা গ্রুপিং প্রক্রিয়া দ্বারা সরানো হয়েছে৷
একবার সমস্ত সারি উপলব্ধ হলে, এটি ক্লাসের টেবিলের দিকে দেখায়। এটি প্রতিটি সারি থেকে প্রতিটি ক্লাসকে "সর্বজনীন" ক্লাসের একটি টেবিলে যুক্ত করে, তারপর প্রতিটি সারির তালিকা দেখে এবং কোনো একটি সারিতে উপস্থিত না থাকলে একটি আইটেম বাদ দিয়ে যেগুলি সর্বজনীন নয় সেগুলিকে ফিল্টার করে৷ তারপর, প্রতিটি সারির ক্লাস টেবিল থেকে "সর্বজনীন" ক্লাসগুলি সরানো হয়, যাতে সেগুলি পরে সদৃশ না হয়৷
এই প্রক্রিয়াকরণটি সম্পন্ন হওয়ার পরে, প্রতিটি সারিকে একটি span
উপাদান দিয়ে ফর্ম্যাট করা হয়েছে যাতে সেই সারির সাথে যুক্ত অতিরিক্ত ক্লাস অন্তর্ভুক্ত থাকে, প্রতিটি সারির জন্য spans
একটি স্থান-বিচ্ছিন্ন হিসাবে যুক্ত হয় তালিকায়, "আলগা বিভাগগুলি" পালাক্রমে ট্যাক করা হয়, এবং তারপর ফলস্বরূপ স্ট্রিংটি প্রধান হ্যাটনোট মডিউলে দেওয়া হয়, মূল হ্যাটনোটে অতিরিক্ত ক্লাসগুলি "সর্বজনীন ক্লাস" টেবিলটিকে একটি স্থান-বিচ্ছিন্ন তালিকায় সংযুক্ত করে সরবরাহ করা হয় এর চাবি
উপরোক্ত নথিটি মডিউল:উর্ধ্বটীকা গ্রুপ/নথি থেকে প্রতিলিপ্ত। (সম্পাদনা | ইতিহাস) সম্পাদনাকারীগণ খেলাঘর (তৈরি করুন | আয়না) এবং পরীক্ষা পাতায় (তৈরি করুন) এই মডিউল সংক্রান্ত পরীক্ষা-নিরীক্ষা করতে পারেন। এই মডিউলের উপপাতাসমূহ। |
local mHatnote = require('Module:Hatnote')
local p = {}
--Collates key-based table of classes into usable class list
function collateClassList (listTable)
local list = {}
for k, v in pairs(listTable) do
if v and type(k) == "string" then table.insert(list, k) end
end
return table.concat(list, " ")
end
--Passes through single argument from parent frame
function p.group (frame)
return p._group(frame:getParent().args[1], frame:getParent().args.category)
end
function p._group (inputText, category)
--If there's an error element, pass everything through unchanged for easier
--error resolution
if string.find(inputText, '<%a- class="error"', 1, true) then return inputText end
--Heavily reused hatnote data capture pattern
local hatnotePattern =
'(<div role="note" class="' ..
string.gsub(mHatnote.defaultClasses(false), "%-", "%%-") ..
'%s?(.-)">(.-)</div>)'
--Capture hatnote divs and "loose" categories; we'll ignore everything else
local rawDivs = {}
local looseCategories = ''
for x in string.gmatch(inputText, hatnotePattern) do
table.insert(rawDivs, x)
end
for x in string.gmatch(inputText, '%[%[Category:.-%]%]') do
looseCategories = looseCategories .. x
end
--if no inner hatnotes, return an error
if not rawDivs[1] then
return mHatnote.makeWikitextError(
'no inner hatnotes detected',
'Template:Hatnote group',
category
)
end
--Preprocess divs into strings and classes
local innerHatnotes = {}
for k, v in pairs(rawDivs) do
row = {}
row.text = string.gsub(v, hatnotePattern, '%3')
--Here we set class names as keys for easier intersection later
row.classes = {}
for m, w in ipairs(
mw.text.split(
string.gsub(v, hatnotePattern, '%2'),
' ',
true
)
) do
row.classes[mw.text.trim(w)] = true
end
table.insert(innerHatnotes, row)
end
--Identify any universal classes ("hatnote" ignored by omission earlier)
local universalClasses = {}
--clone first classes table to force passing by value rather than reference
for k, v in pairs(innerHatnotes[1].classes) do universalClasses[k] = v end
for k, v in ipairs(innerHatnotes) do
for m, w in pairs(universalClasses) do
universalClasses[m] = (universalClasses[m] and v.classes[m])
end
end
--Remove universal classes from div items, then create class strings per row
for k, v in ipairs(innerHatnotes) do
for m, w in pairs(v.classes) do
if universalClasses[m] then v.classes[m] = nil end
end
v.classString = collateClassList(v.classes)
end
--Process div items into classed span items
local innerSpans = {}
for k, v in ipairs(innerHatnotes) do
table.insert(
innerSpans,
tostring(
mw.html.create("span")
:addClass(v.classString ~= '' and v.classString or nil)
:wikitext(v.text)
)
)
end
--Concatenate spans and categories, and return wrapped as a single hatnote
local outputText = table.concat(innerSpans, " ") .. looseCategories
local hnOptions = {extraclasses = collateClassList(universalClasses)}
return mHatnote._hatnote(outputText, hnOptions)
end
return p