跳转到内容

模組:@BAG

维基百科,自由的百科全书
local p = {}

local PAGE = 'Wikipedia:機械人審核小組'

local yesno = require('Module:Yesno')

function p.main(frame)
	local args = frame:getParent().args
	
    -- 生成:
    local output = ''
    if not yesno(args.hidden, false) then
        output = '@[[Wikipedia:机器人/申请|BAG成员]]:'
    end
	
    -- 取得目标页面源码
    local title = mw.title.new(PAGE)
    if not title then
        return output .. '<strong class="error">無法建立頁面標題。</strong>'
    end

    local content = title:getContent()
    if not content then
        return output .. '<strong class="error">無法讀取 [[' .. PAGE .. ']]。</strong>'
    end

    -- 截取「活躍成員」到「不活躍成員」之间的内容。
    local membersStart, membersHeadingEnd = content:find(
	    '==%s*成員名單%s*=='
	)

	-- 找下一個二級標題,限制搜尋範圍在「成員名單」section 內
	local activeStart = content:find('==%s*成員名單%s*==')
	if not activeStart then
		return output .. '<strong class="error">找不到「成員名單」段落。</strong>'
	end
	activeStart = content:find('活躍成員', activeStart, true)
    if not activeStart then
        return output .. '<strong class="error">找不到「活躍成員」段落。</strong>'
    end

    local inactiveStart = content:find('不活躍成員', activeStart, true)
    if not inactiveStart then
        return output .. '<strong class="error">找不到「不活躍成員」段落。</strong>'
    end

    local section = content:sub(activeStart, inactiveStart - 1)

    -- 提取 {{user|...}}
    local users = {}

    for username in section:gmatch(
        '{{%s*[Uu][Ss][Ee][Rr]%s*|%s*([^|}]+)'
    ) do
        username = mw.text.trim(username)

        if username ~= '' then
            table.insert(users, username)
        end
    end

    if #users == 0 then
        return output .. '<strong class="error">沒有找到活躍成員。</strong>'
    end

    -- hidden ping
    output = output .. frame:preprocess(
        '{{hidden ping|' .. table.concat(users, '|') .. '}}'
    )
    return output
end

return p