模組:PatternedCandidateUtils2
本模块用于创建页面的标题列表。
用法
[编辑]listtalk
[编辑]自动抽取页面中的二级标题,列举出来并设置链接。
{{#invoke:PatternedCandidateUtils2|listtalk|页面名称}}
- 示例1:
{{#invoke:PatternedCandidateUtils2|listtalk|Wikipedia:互助客栈/其他}}:
2026年仲裁委员会选举-2026年10月管理人员选举-典优用户私人内容评选重定向的问题-2026年亞洲月-海上丝绸之路编辑松-于 T:ASN 中撤下所有无关的站外群组-是否在維基百科首頁加入「幫我們改善條目!」欄位?-有关 XiaoFui 系傀儡的管理操作修正请求-仲裁委員會佈告板不讓非仲裁委員提意見和編輯是否合理?-請考慮設立LTA:XiaoFui-那個仲裁委員會選舉今天早上開始了,在哪裡進行安全投票?-请求处理下列傀儡-管理人員申請意向調查:Ppolar bear-有人在粵維亂寫條目,被高雄市議員候選人申告了-「舞文弄法」晦涩难懂吗?-仲裁委員會搞了兩年多,仲裁委員會動議居然沒有一票反對票-请求复核对User:静魔魔女的禁制-提议将WP:LTA的标题修改为“持续出没的滥用者”
- 示例2(自定义锚点):
{{#invoke:PatternedCandidateUtils2|listtalk|Wikipedia:優良條目評選/提名區|linkprefix=Wikipedia:優良條目評選#}}:
奧斯特利茨之戰-蒋母墓-埃利奥特·希-望海楼天主堂-菊池神社 (菊池市)
count
[编辑]统计页面中标题的数量:
{{#invoke:PatternedCandidateUtils2|count|Wikipedia:互助客栈/其他}}:
18
与PatternedCandidateUtils区别
[编辑]相比于Module:PatternedCandidateUtils,PatternedCandidateUtils2的主要区别如下:
- 增加listtalk,默认识别二级标题,且对标题的识别更加智能。
- PatternedCandidateUtils用于首页和系统界面,被模板保护。本模块暂未保护。
PatternedCandidateUtils2的listtalk和count对Module:PatternedCandidateUtils保持向下兼容。
--[=[
已知以下幾種情況會導致錯誤,但是我們可以善意地認為沒有人會故意這樣做:
1. 只有一個標題,後面沒有文字(或者是緊接著下一個標題)
2. <nowiki>
...
== aaa ==
...
</nowiki>
3. 放一個大小寫混用的HTML標籤 // Special:Redirect/revision/43073725 真的有人故意这么做
4. 在標題中使用<ref>
5. 標題沒有文字
6. 标题中使用了[[User:Example|{{^}}]]这样的变态链接
7. 標題位於模板內部
還有
1. 没有人连续使用标题
2. 大家都会空行
]=]--
local z = {}
local HTMLTAGS = {'b', '[Bb][Ii][Gg]', 'blockquote', 'br', 'caption', 'center', 'code', 'del', 'div', 'em', 'font', 'i', 'kbd', 'mark', 'p', 'q', 'rp', 'rt', 'ruby', 's', 'small', 'span', 'strong', 'sub', 'sup', 'time', 'tt',
'B', 'BLOCKQUOTE', 'BR', 'CAPTION', 'CENTER', 'CODE', 'DEL', 'DIV', 'EM', 'FONT', 'I', 'KBD', 'MARK', 'P', 'Q', 'RP', 'RT', 'RUBY', 'S', 'SMALL', 'SPAN', 'STRONG', 'SUB', 'SUP', 'TIME', 'TT'
}
local function getCandidates( frame )
local page = mw.title.new( frame.args.title ):getContent() or ''
local matches = {}
local black = {}
if frame.args.black then
for b in mw.text.gsplit( frame.args.black, '|', true ) do
black[b] = true
end
end
-- 去除跨行的模板,以此忽略[[T:比較條文]]等模板內部會自動替換爲[[T:Fakeh2]]的標題
string.gsub( page, '{%b{}}' , function (t)
if string.find( t, '\n' ) then
return ''
end
return nil
end )
for m in mw.ustring.gmatch( page, frame.args.pattern ) do
if not black[m] then
table.insert( matches, m )
end
end
return matches
end
-- 设置默认参数
local function prefill( frame )
frame.args.pattern = frame.args.pattern or '\n==([^=][^\n]-)== -\n'
if frame.args[1] and not frame.args.title then
frame.args.title = frame.args[1]
end
frame.args.linkprefix = frame.args.linkprefix or (mw.text.trim(frame.args.title or '') .. '#')
end
function z.count( frame )
prefill(frame)
return #getCandidates( frame )
end
local function encodetitle( frame, text )
-- 该函数将标题转化为锚点文字
frame=frame or mw.getCurrentFrame()
local r = text
-- 提取<nowiki>和<pre>內容
local nowikis = {}
local extract = function (s)
nowikis[#nowikis+1] = s
return '__NOWIKI_UNIT_' .. #nowikis
end
r = string.gsub(r, '<[Nn][Oo][Ww][Ii][Kk][Ii]>(.-)</[Nn][Oo][Ww][Ii][Kk][Ii]>', extract)
r = string.gsub(r, '<pre>(.-)</pre>', extract)
-- 解析wikitext
r = frame:preprocess(r)
-- 粗體與斜體
r = string.gsub(r, "'''''(.-)'''''", '%1')
r = string.gsub(r, "'''(.-)'''", '%1')
r = string.gsub(r, "''(.-)''", '%1')
-- 去除圖片
r = string.gsub(r, '%[%[[Ff]ile:(.-)%]%]', '')
r = string.gsub(r, '%[%[[Ii]mage:(.-)%]%]', '')
r = string.gsub(r, '%[%[文件:(.-)%]%]', '')
r = string.gsub(r, '%[%[檔案:(.-)%]%]', '')
-- 去除分类
r = string.gsub(r, '%[%[[Cc]ategory:(.-)%]%]', '')
r = string.gsub(r, '%[%[分类:(.-)%]%]', '')
-- 去除ref和math等標籤
r = mw.text.killMarkers(r)
-- 展開連結
r = string.gsub(r, '%[%[[^%]]-%|(.-)%]%]', '%1')
r = string.gsub(r, '%[%[:?(.-)%]%]', '%1')
r = string.gsub(r, '%[[^%]]-% (.-)%]', '%1')
-- 去除HTML標籤
for i, t in ipairs(HTMLTAGS) do
r = string.gsub(r, '</?' .. t.. '.->', '')
end
-- 將pre與nowiki內容放回文字之中
for i, t in ipairs(nowikis) do
local u = mw.text.encode(t)
r = string.gsub(r, '__NOWIKI_UNIT_' .. i, u)
end
-- 更換特殊字元
r = mw.text.encode(r, '%[%]%|{}')
return mw.text.trim(r)
end
function z.encodetitle(text)
return encodetitle(mw.getCurrentFrame(),text)
end --便于其他模块借用此函数
function z.list( frame )
prefill(frame)
local list = getCandidates( frame )
local linkprefix = mw.text.trim(frame.args.linkprefix)
local anchorno = {}
for i = 1, #list do
if linkprefix ~= '' then
local title = encodetitle(frame, mw.text.trim(list[i]))
-- 記錄標題文字,如果重複,那麼在後面附加「_2」、「_3」……
anchorno[title] = (anchorno[title] or 0) + 1
local postfix = (anchorno[title] > 1 and '_' .. anchorno[title]) or ''
list[i] = '[[:' .. linkprefix .. title .. postfix .. '|' .. title .. ']]'
else
list[i] = '[[:' .. list[i] .. ']]'
end
end
if #list > 0 then
return table.concat( list, frame.args.concat or '-' )
else
return '暂无'
end
end
function z.listtalk( frame )
return z.list(frame)
end
return z