From 3609ee99e5cc5e6da716c1d6d4ab82d8e067fede Mon Sep 17 00:00:00 2001
From: Tphamtranba <119475427+Bapham12@users.noreply.github.com>
Date: Sun, 29 Mar 2026 18:47:58 +0700
Subject: [PATCH 1/2] Create High-use.lua
---
IMPORTANT/High-use.lua | 177 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 177 insertions(+)
create mode 100644 IMPORTANT/High-use.lua
diff --git a/IMPORTANT/High-use.lua b/IMPORTANT/High-use.lua
new file mode 100644
index 0000000..1694b2d
--- /dev/null
+++ b/IMPORTANT/High-use.lua
@@ -0,0 +1,177 @@
+local p = {}
+
+-- _fetch looks at the "demo" argument.
+local _fetch = require('Mô đun:Transclusion_count').fetch
+local yesno = require('Mô đun:Yesno')
+
+function p.num(frame, count)
+ if count == nil then
+ if yesno(frame.args['fetch']) == false then
+ if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
+ else
+ count = _fetch(frame)
+ end
+ end
+
+ -- Build output string
+ local return_value = ""
+ if count == nil then
+ if frame.args[1] == "risk" then
+ return_value = "một số lượng lớn"
+ else
+ return_value = "rất nhiều"
+ end
+ else
+ -- Use 2 significant figures for smaller numbers and 3 for larger ones
+ local sigfig = 2
+ if count >= 100000 then
+ sigfig = 3
+ end
+
+ -- Prepare to round to appropriate number of sigfigs
+ local f = math.floor(math.log10(count)) - sigfig + 1
+
+ -- Round and insert "approximately" or "+" when appropriate
+ if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
+ -- Round down
+ return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
+ else
+ -- Round to nearest
+ return_value = string.format("khoảng %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
+ end
+
+ -- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
+ if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
+ local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
+ if percent >= 1 then
+ return_value = string.format("%s trang, chiếm ≈ %s%% tổng số", return_value, percent)
+ end
+ end
+ end
+
+ return return_value
+end
+
+-- Actions if there is a large (greater than or equal to 100,000) transclusion count
+function p.risk(frame)
+ local return_value = ""
+ if frame.args[1] == "risk" then
+ return_value = "risk"
+ else
+ local count = _fetch(frame)
+ if count and count >= 100000 then return_value = "risk" end
+ end
+ return return_value
+end
+
+function p.text(frame, count)
+ -- Only show the information about how this template gets updated if someone
+ -- is actually editing the page and maybe trying to update the count.
+ local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Thông báo xem trước''': Số lượt nhúng được cập nhật định kì ([[Bản mẫu:High-risk/doc#Chi tiết kĩ thuật|xem tài liệu]])." or ''
+
+ if count == nil then
+ if yesno(frame.args['fetch']) == false then
+ if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
+ else
+ count = _fetch(frame)
+ end
+ end
+ local title = mw.title.getCurrentTitle()
+ if title.subpageText == "doc" or title.subpageText == "sandbox" then
+ title = title.basePageTitle
+ end
+
+ local systemMessages = frame.args['system']
+ if frame.args['system'] == '' then
+ systemMessages = nil
+ end
+
+ -- This retrieves the project URL automatically to simplify localiation.
+ local templateCount = ('ở rất nhiều trang'):format(
+ mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
+ mw.uri.encode(title.fullText), p.num(frame, count))
+ local used_on_text = "'''" .. (mw.title.getCurrentTitle().namespace == 828 and 'Mô đun Lua' or 'Bản mẫu') .. ' này được sử dụng ';
+ if systemMessages then
+ used_on_text = used_on_text .. systemMessages ..
+ ((count and count > 2000) and ("''', và " .. templateCount) or "'''")
+ else
+ used_on_text = used_on_text .. templateCount .. "'''"
+ end
+
+
+ local sandbox_text = ("trang con [[%s/sandbox|/sandbox]], [[%s/testcases|/testcases]] của %s, hoặc ở %s. "):format(
+ title.fullText, title.fullText,
+ (mw.title.getCurrentTitle().namespace == 828 and "mô đun" or "bản mẫu"),
+ mw.title.getCurrentTitle().namespace == 828 and "[[Mô đun:Sandbox|chỗ thử mô đun]]" or "không gian người dùng của bạn"
+ )
+
+ local infoArg = frame.args["info"] ~= "" and frame.args["info"]
+ if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
+ local info = systemMessages and '.
Thay đổi đến nó có thể dẫn đến thay đổi ngay lập tức giao diện người dùng BKDatabase.' or '.'
+ if infoArg then
+ info = info .. '
' .. infoArg
+ end
+ sandbox_text = info .. '
Để tránh gây lỗi trên quy mô lớn' ..
+ (count and count >= 100000 and ' và [[:mw:Manual:Job queue|tải máy chủ]] không cần thiết' or '') ..
+ ', tất cả thay đổi cần được thử nghiệm ở ' .. sandbox_text ..
+ 'Các thay đổi đã được thử nghiệm có thể thêm vào ' .. (mw.title.getCurrentTitle().namespace == 828 and "mô đun" or "bản mẫu") ..
+ ' bằng một sửa đổi duy nhất. '
+ else
+ sandbox_text = (infoArg and ('.
' .. infoArg .. ' N') or ', vì thế n') ..
+ 'hững thay đổi đến nó sẽ hiện ra rõ ràng. Vui lòng thử nghiệm các thay đổi ở ' .. sandbox_text
+ end
+
+
+ local discussion_text = (systemMessages or frame.args[1] == "risk" or (count and count >= 100000)) and 'Xin hãy thảo luận các thay đổi ' or 'Cân nhắc thảo luận các thay đổi '
+ if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
+ discussion_text = string.format("%stại [[%s]]", discussion_text, frame.args["2"])
+ else
+ discussion_text = string.format("%stại [[%s|trang thảo luận]]", discussion_text, title.talkPageTitle.fullText )
+ end
+
+ return used_on_text .. sandbox_text .. discussion_text .. ' trước khi áp dụng sửa đổi.' .. bot_text
+end
+
+function p.main(frame)
+ local count = nil
+ if yesno(frame.args['fetch']) == false then
+ if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
+ else
+ count = _fetch(frame)
+ end
+ local image = "[[Tập_tin:BrainrotBiohazard.png|40px|alt=Chú ý|link=]]"
+ local type_param = "style"
+ local epilogue = ''
+ if frame.args['system'] and frame.args['system'] ~= '' then
+ image = "[[Tập_tin:BrainrotBiohazard.png|40px|alt=Chú ý|link=]]"
+ type_param = "content"
+ local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
+ local categorise = (nocat == '' or not yesno(nocat))
+ if categorise then
+ epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#gọi:Effective protection level|{{#switch:{{NAMESPACE}}|{{ns:6}}=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|interfaceadmin=|#default=}}}}')
+ end
+ elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
+ image = "[[Tập_tin:BrainrotBiohazard.png|40px|alt=Chú ý|link=]]"
+ type_param = "content"
+ end
+
+ if frame.args["form"] == "editnotice" then
+ return frame:expandTemplate{
+ title = 'editnotice',
+ args = {
+ ["image"] = image,
+ ["text"] = p.text(frame, count),
+ ["expiry"] = (frame.args["expiry"] or "")
+ }
+ } .. epilogue
+ else
+ return require('Mô đun:Message box').main('ombox', {
+ type = type_param,
+ image = image,
+ text = p.text(frame, count),
+ expiry = (frame.args["expiry"] or "")
+ }) .. epilogue
+ end
+end
+
+return p
From 190e288fc596791921ed5605b910620e7c33f5e9 Mon Sep 17 00:00:00 2001
From: Tphamtranba <119475427+Bapham12@users.noreply.github.com>
Date: Sun, 29 Mar 2026 18:49:08 +0700
Subject: [PATCH 2/2] Create Transclusion count.lua
---
Other/Transclusion count.lua | 68 ++++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
create mode 100644 Other/Transclusion count.lua
diff --git a/Other/Transclusion count.lua b/Other/Transclusion count.lua
new file mode 100644
index 0000000..a97fabf
--- /dev/null
+++ b/Other/Transclusion count.lua
@@ -0,0 +1,68 @@
+local p = {}
+
+function p._fetch(args)
+ local template = nil
+ local return_value = nil
+
+ -- Use demo parameter if it exists, otherwise use current template name
+ local namespace = mw.title.getCurrentTitle().namespace
+ if args["demo"] and args["demo"] ~= "" then
+ template = mw.ustring.gsub(args["demo"],"^[Bb]ản mẫu:","")
+ elseif namespace == 10 then -- Template namespace
+ template = mw.title.getCurrentTitle().text
+ elseif namespace == 828 then -- Module namespace
+ template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
+ end
+
+ -- If in template or module namespace, look up count in /data
+ if template ~= nil then
+ namespace = mw.title.new(template, "Template").namespace
+ if namespace == 10 or namespace == 828 then
+ template = mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
+ template = mw.ustring.gsub(template, "/tài liệu$", "") -- cho mô đun tại viwiki
+ template = mw.ustring.gsub(template, "/sandbox$", "") -- strip /sandbox from end
+ local index = mw.ustring.sub(mw.title.new(template).text,1,1)
+ local status, data = pcall(function ()
+ return(mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "[A-Z]") and index or "other")))
+ end) -- xếp và tìm kiếm Á, Ẩ, Đ, Ý,... trên viwiki tại other
+ if status then
+ return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
+ end
+ end
+ end
+
+ -- If database value doesn't exist, use value passed to template
+ if return_value == nil and args[1] ~= nil then
+ local arg1=mw.ustring.match(args[1], '[%d,]+')
+ if arg1 and arg1 ~= '' then
+ return_value = tonumber(mw.getCurrentFrame():callParserFunction('formatnum', arg1, 'R'))
+ end
+ end
+
+ return return_value
+end
+
+function p.fetch(frame)
+ return p._fetch(frame.args)
+end
+
+-- Tabulate this data for most used templates on pages
+function p.tabulate()
+ local list = {}
+ for i = 65, 91 do
+ local data = mw.loadData('Module:Transclusion count/data/' .. ((i == 91) and 'other' or string.char(i)))
+ for name, count in pairs(data) do
+ table.insert(list, {mw.title.new(name, "Template").fullText, count})
+ end
+ end
+ table.sort(list, function(a, b)
+ return (a[2] == b[2]) and (a[1] < b[1]) or (a[2] > b[2])
+ end)
+ local lang = mw.getContentLanguage();
+ for i = 1, #list do
+ list[i] = ('|-\n| %d || [[%s]] || %s\n'):format(i, list[i][1]:gsub('_', ' '), lang:formatNum(list[i][2]))
+ end
+ return table.concat(list)
+end
+
+return p