local data = mw.loadData('মডিউল:আধ্বব প্রতীক/উপাত্ত') local univPatterns, keyPatterns = data.data.univPatterns, data.data.keyPatterns data = data.rawData  local p = {}  function p.main(frame) 	local ret, count, sCount = {}, {}, {} 	 	-- Error detection 	do 		local symbols, dupes, invChars = {}, {}, {} 		local function checkSubs(t, s, name) 			for _, v in ipairs(t) do 				local matched = mw.ustring.match(s, v.pat) 				if matched then 					table.insert(invChars, { name, matched, v.rep }) 				end 			end 		end 		local function check(s, checkKeyPats) 			sCount[s] = 0 			for i, v in ipairs(data[s]) do 				for _, symbol in ipairs(v.symbols) do 					if symbols[symbol] then 						table.insert(dupes, symbol) 					else 						symbols[symbol] = true 					end 					checkSubs(univPatterns, symbol, v.name) 					if checkKeyPats then 						checkSubs(keyPatterns, symbol, v.name) 					end 					sCount[s] = sCount[s] + 1 				end 				count[s] = i 			end 		end 		check('sounds', true) 		check('diacritics') 		 		if dupes[1] or invChars[1] then 			for _, v in ipairs(dupes) do 				table.insert(ret, string.format( 					'*ত্রুটি: "%s" একের অধিকবার সংজ্ঞায়িত করা হয়েছে।\n', 					mw.text.nowiki(v))) 			end 			for _, v in ipairs(invChars) do 				table.insert(ret, string.format( 					'*ত্রুটি: "%s" এর জন্য একটি চিহ্ন "%s" ব্যবহার করছে, যা "%s" দ্বারা প্রতিস্থাপন করা হবে।\n', 					v[1], mw.text.nowiki(v[2]), mw.text.nowiki(v[3]))) 			end 		else 			table.insert(ret, 'কোন ত্রুটি পাওয়া যায়নি। ') 		end 	end 	 	table.insert(ret, string.format( 		'%s entries (%s in "sounds", %s in "diacritics"), %s symbols (%s in "sounds", %s in "diacritics").\n\n', 		count.sounds + count.diacritics, count.sounds, count.diacritics, 		sCount.sounds + sCount.diacritics, sCount.sounds, sCount.diacritics)) 	table.insert(ret, 		'Parentheses denote a link automatically inherited from the name field. In italics are redirects.\n') 	 	-- Table 	table.insert(ret, 		'{| class="wikitable sortable"\n!নাম!!চিহ্ন!!নিবন্ধ!!অডিও!!দল\n') 	local function renderRows(s) 		for _, v in ipairs(data[s]) do 			local parenL = v.article and  or '(' 			local parenR = v.article and  or ')' 			local article = v.article or v.name 			local rt = mw.title.new(article).redirectTarget 			local isRedr = rt and true 			rt = isRedr and rt.text or article 			local symbols = {} 			for j, w in ipairs(v.symbols) do symbols[j] = mw.text.nowiki(w) end 			local italics = isRedr and "" or  			 			local audio = 			if v.audio then 				if frame.args.check_wikidata == 'yes' then 					local qId = mw.wikibase.getEntityIdForTitle(rt) 					local wdAudio = qId and mw.wikibase.getEntity(qId).claims 					wdAudio = wdAudio and wdAudio['P51'] 					if wdAudio then 						wdAudio = wdAudio[1].mainsnak.datavalue.value 						audio = wdAudio and wdAudio ~= v.audio 							and ' (≠ উইকিউপাত্ত)' 							or  					elseif qId then 						audio = ' (not on উইকিউপাত্ত)' 					end 				end 				audio = string.format( 					'%s (চালান)', 					v.audio, v.audio, v.audio) .. audio 			end 			 			table.insert(ret, string.format( 				'|-\n|%s||class="IPA"|%s||%s%s:%s%s%s||%s||%s\n', 				v.name, table.concat(symbols, ' , '), parenL, italics, 				article, italics, parenR, audio, s)) 		end 	end 	renderRows('sounds') 	renderRows('diacritics') 	table.insert(ret, '|}') 	 	return table.concat(ret) end  return p