模組:DYKCount/sandbox
外观
这是Module:DYKCount(差异)的沙盒。 |
local p = {}
local lib_var = {}
local lib_arg = {}
local yesno = require('Module:Yesno')
local mError = require('Module:Error').error
local fullurl = require('Module:Fullurl')._fullurl
local function plainlink (url, text)
return mw.html.create():tag('span'):addClass('plainlinks'):wikitext('[' .. url .. ' ' .. text .. ']')
end
local function button (url, class, style, text)
local button = require('Module:Clickable_button_2').luaMain
local args = {
url = url,
class = class,
style = style,
[1] = text
}
end
function count_DYKEntry(title, offset)
local pattern = "{{%s*DYKEntry%s*|.-timestamp%s*="
offset = tonumber(offset or 0) or 0
title = mw.title.new(title, '')
if title then
local wikitext = title:getContent()
wikitext = mw.text.decode(wikitext)
local _,count = mw.ustring.gsub(wikitext, pattern, '')
local h_id = count + 1 + offset
return h_id
end
return ''
end
function count_dyk_section(frame, title, offset)
local pattern = "\127'\"`UNIQ%-%-h%-(%d+)%-%-QINU`\"'\127" -- <h></h>或章節標題的strip marker是十進位 (截至2020年3月4日)
offset = tonumber(offset or 0) or 0
title = mw.title.new(title, '')
if title then
local wikitext = title:getContent()
wikitext = mw.text.decode(wikitext)
wikitext = mw.ustring.gsub(wikitext, '[%<%[%{%}%]%>%|%a%d]', '*') --有人奇特簽名會出錯,因此轉義掉;另{}不轉義掉會模板循環。
wikitext = mw.ustring.gsub(wikitext, '%*+', '%%') --清理重複轉義字元以減少解析器負擔
--mw.log(wikitext)
local avoid_r = frame:newChild{ title = title.fullText, args = {} }
local checker = avoid_r:preprocess( "== ~ ==\n\n" .. wikitext ) --前方字串是基底,移除會導致運算出問題
local max_id, min_id = 0, -1
--請勿改成計算評選數,因為不能排除評選中間出現子章節
mw.ustring.gsub(checker, pattern, function(h_id)
local h_idx = tonumber(h_id) -- <h></h>或章節標題的strip marker是十進位 (截至2020年3月4日,如未來有更動請修改或新增第二參數)
if h_idx then
if h_idx > max_id then max_id = h_idx end
if min_id < 0 or h_idx < max_id then min_id = h_idx end
end
end)
if (max_id + offset - min_id - 1) < 0 then
return max_id
end
return max_id + offset - min_id - 1
end
return ''
end
local function button(frame, args)
local text = args[1] or args['1'] or ''
local section = args[2] or args['2'] or 0
if text == '' then
text = '提交新评选提名'
end
local getlink = yesno(args['link'] or 0)
local onlyurl = yesno(args['only'] or 0)
local style = args['style']
local buttonclass = "mw-ui-button mw-ui-progressive mw-ui-big"
local url_arg = {
title = 'Wikipedia:新条目推荐/候选',
action = 'edit',
section = count_dyk_section(frame, 'Wikipedia:新条目推荐/候选', section),
summary = '提交新的新条目推荐评选提名',
onlyurl = 1
}
local url = fullurl(url_arg)
local button = button(url, buttonclass, style, text)
local wt
if getlink then
return plainlink( url , text )
end
if onlyurl then
wt = 'https:' .. url
return wt
end
wt = mw.text.tag('div',{ style = "text-align: center;"}, tostring(button))
return wt
end
function p.button (frame)
if lib_var._arg_process == nil then lib_var = require('Module:Var') end
local args, working_frame = lib_var._arg_process(frame)
return button(frame, args)
end
return p