From 4cccea1fe1683b1e9c7a07e63e7b8a2e3c9121a0 Mon Sep 17 00:00:00 2001 From: Tphamtranba <119475427+Bapham12@users.noreply.github.com> Date: Thu, 16 Apr 2026 18:01:46 +0700 Subject: [PATCH 1/6] Add main.lua for TemplateStyles module --- Uses TemplateStyles/main.lua | 157 +++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 Uses TemplateStyles/main.lua diff --git a/Uses TemplateStyles/main.lua b/Uses TemplateStyles/main.lua new file mode 100644 index 0000000..0189f02 --- /dev/null +++ b/Uses TemplateStyles/main.lua @@ -0,0 +1,157 @@ +local yesno = require('Module:Yesno') +local mList = require('Module:List') +local mTableTools = require('Module:TableTools') +local mMessageBox = require('Module:Message box') +local TNT = require('Module:TNT') + +local p = {} + +local function format(msg, ...) + return TNT.format('I18n/Uses TemplateStyles', msg, ...) +end + +local function getConfig() + return mw.loadData('Module:Uses TemplateStyles/config') +end + +local function makeEditSup(pageName) + return string.format('[[[Special:Edit/%s|e]]]', pageName) +end + +-- Build just the "(sandbox)" suffix using the i18n message, without duplicating the main link. +local function makeSandboxSuffix(tsSandboxPrefixed) + -- i18n message is: "$1 ([[$2|sandbox]])" + -- Passing empty $1 yields " ([[:...|sandbox]])" -> trim leading whitespace to get "(sandbox)" portion. + local s = format('sandboxlink', '', ':' .. tsSandboxPrefixed) + return (s:gsub('^%s+', '')) +end + +local function renderBox(tStyles) + local boxArgs = { + type = 'notice', + small = true, + image = string.format('[[Tập tin:Farm-Fresh css add.svg|32px|alt=%s]]', format('logo-alt')) + } + + if #tStyles < 1 then + boxArgs.text = string.format('%s', format('error-emptylist')) + else + local cfg = getConfig() + local tStylesLinks = {} + + for i, ts in ipairs(tStyles) do + local viewLink = string.format('[[:%s]]', ts) + local editSup = makeEditSup(ts) + + local out = viewLink .. editSup + + -- Optional sandbox link + sandbox edit link + local tsTitle = mw.title.new(ts) + if tsTitle and cfg['sandbox_title'] then + local tsSandboxTitle = mw.title.new(string.format( + '%s:%s/%s/%s', + tsTitle.nsText, + tsTitle.baseText, + cfg['sandbox_title'], + tsTitle.subpageText + )) + + if tsSandboxTitle and tsSandboxTitle.exists then + local sandboxSuffix = makeSandboxSuffix(tsSandboxTitle.prefixedText) + local sandboxEditSup = makeEditSup(tsSandboxTitle.prefixedText) + out = out .. ' ' .. sandboxSuffix .. ' ' .. sandboxEditSup + end + end + + tStylesLinks[i] = out + end + + local tStylesList = mList.makeList('bulleted', tStylesLinks) + boxArgs.text = format( + mw.title.getCurrentTitle():inNamespaces(828, 829) and 'header-module' or 'header-template' + ) .. '\n' .. tStylesList + end + + return mMessageBox.main('mbox', boxArgs) +end + +local function renderTrackingCategories(args, tStyles, titleObj) + if yesno(args.nocat) then + return '' + end + + local cfg = getConfig() + local cats = {} + + -- Error category + if #tStyles < 1 and cfg['error_category'] then + cats[#cats + 1] = cfg['error_category'] + end + + -- TemplateStyles category + titleObj = titleObj or mw.title.getCurrentTitle() + if (titleObj.namespace == 10 or titleObj.namespace == 828) + and not cfg['subpage_blacklist'][titleObj.subpageText] + then + local category = args.category or cfg['default_category'] + if category then + cats[#cats + 1] = category + end + if not yesno(args.noprotcat) and (cfg['protection_conflict_category'] or cfg['padlock_pattern']) then + local currentProt = titleObj.protectionLevels["edit"] and titleObj.protectionLevels["edit"][1] or nil + local addedLevelCat = false + local addedPadlockCat = false + for _, ts in ipairs(tStyles) do + local tsTitleObj = mw.title.new(ts) + local tsProt = tsTitleObj.protectionLevels["edit"] and tsTitleObj.protectionLevels["edit"][1] or nil + if cfg['padlock_pattern'] and tsProt and not addedPadlockCat then + local content = tsTitleObj:getContent() + if not content:find(cfg['padlock_pattern']) then + cats[#cats + 1] = cfg['missing_padlock_category'] + addedPadlockCat = true + end + end + if cfg['protection_conflict_category'] and currentProt and tsProt ~= currentProt and not addedLevelCat then + currentProt = cfg['protection_hierarchy'][currentProt] or 0 + tsProt = cfg['protection_hierarchy'][tsProt] or 0 + if tsProt < currentProt then + addedLevelCat = true + cats[#cats + 1] = cfg['protection_conflict_category'] + end + end + end + end + end + + for i, cat in ipairs(cats) do + cats[i] = string.format('[[Thể loại:%s]]', cat) + end + return table.concat(cats) +end + +function p._main(args) + local cfg = getConfig() + if #args == 0 then + local prefixed = mw.title.getCurrentTitle().prefixedText + prefixed = prefixed:gsub("/doc", "") + args[1] = prefixed .. "/" .. cfg["default_subpage_name"] + end + local tStyles = mTableTools.compressSparseArray(args) + local box = renderBox(tStyles) + local trackingCategories = renderTrackingCategories(args, tStyles) + return box .. trackingCategories +end + +function p.main(frame) + local origArgs = frame:getParent().args + local args = {} + for k, v in pairs(origArgs) do + v = v:match('^%s*(.-)%s*$') + if v ~= '' then + args[k] = v + end + end + return p._main(args) +end + +return p From 8ea009781e3fba59e37af0db03ccf6a1dd816ad3 Mon Sep 17 00:00:00 2001 From: Tphamtranba <119475427+Bapham12@users.noreply.github.com> Date: Thu, 16 Apr 2026 18:02:13 +0700 Subject: [PATCH 2/6] Add configuration for TemplateStyles module --- Uses TemplateStyles/config.lua | 58 ++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 Uses TemplateStyles/config.lua diff --git a/Uses TemplateStyles/config.lua b/Uses TemplateStyles/config.lua new file mode 100644 index 0000000..3a34837 --- /dev/null +++ b/Uses TemplateStyles/config.lua @@ -0,0 +1,58 @@ +local cfg = {} -- Don’t touch this line. + +-- Subpage blacklist: these subpages will not be categorized (except for the +-- error category, which is always added if there is an error). +-- For example “Template:Foo/doc” matches the `doc = true` rule, so it will have +-- no categories. “Template:Foo” and “Template:Foo/documentation” match no rules, +-- so they *will* have categories. All rules should be in the +-- [''] = true, +-- format. +cfg['subpage_blacklist'] = { + ['doc'] = true, + ['sandbox'] = true, + ['sandbox2'] = true, + ['testcases'] = true, +} + +-- Sandbox title: if the stylesheet’s title is