Mô đun:Status
Giao diện
| Mô đun này được xếp loại beta. Nó được đánh giá là sẵn sàng để sử dụng rộng rãi, nhưng vì nó vẫn còn khá là mới, nên vẫn cần phải được sử dụng một cách thận trọng để đảm bảo rằng kết quả đạt được như mong đợi. |
| Trang mô đun này đang bị khóa không cho sửa đổi. Xem quy định khóa trang và nhật trình khóa để biết thêm chi tiết. Vui lòng thảo luận bất kỳ thay đổi nào tại trang thảo luận; bạn có thể yêu cầu sửa trang này để yêu cầu bảo quản viên sửa đổi trang nếu sửa đổi đó là sửa đổi không gây hại hoặc được chấp nhận sự đồng thuận. Bạn cũng có thể yêu cầu mở khóa trang này. |
| Mô đun này phụ thuộc vào các mô đun sau: |
Mô đun triển khai bản mẫu {{status}}. Xem tài liệu về cách sử dụng tại {{status}}.
-- This module implements {{status}}-- Initialise necessary moduleslocal Object = require('Module:Classic')local CountVotes = require('Module:CountVotes')._mainlocal yesno = require('Module:Yesno')-- Lazily initialise modules and objects we don't always needlocal lang-- Set constantslocal CONFIG_MODULE = 'Module:Status/config'local LINE_FEED = '
'---------------------------------------------------------------------------------- Helper class--------------------------------------------------------------------------------local Helper = Object:extend()function Helper:validateDate(dateString) lang = lang or mw.language.getContentLanguage() local success, result = pcall(lang.formatDate, lang, 'U', dateString) if success then result = tonumber(result) if result then return true end end error(string.format('ngày tháng không hợp lệ: %s', tostring(dateString)))endfunction Helper:isUnixTime(dateString) local success, result = pcall(os.date, '!%Y-%m-%dT%TZ', dateString) if success then return true end return falseendfunction Helper:formatDate(dateString, format) lang = lang or mw.language.getContentLanguage() if Helper:isUnixTime(dateString) then if format == 'U' then return dateString end return lang:formatDate(format, os.date('!%Y-%m-%dT%TZ', dateString)) end if Helper:validateDate(dateString) then return lang:formatDate(format, dateString) endendfunction Helper:substParams(msg, params) return msg:gsub('${(%u+)}', params)endfunction Helper:dayToSecond(dayNumber) return tonumber(dayNumber) * 24 * 3600endfunction Helper:breakLines(title) return title:gsub('%. ', '. ' .. LINE_FEED) -- Phải dùng bản mẫu trung gian để escapeendfunction Helper:countdown(duration) return string.format( '%s ngày %s giờ %s phút %s giây', duration.days or 0, duration.hours or 0, duration.minutes or 0, duration.seconds or 0 )endfunction Helper:votesNumberTitle(positiveVotesNumber, negativeVotesNumber) return string.format( ' ' .. LINE_FEED .. 'Số phiếu thuận là %s. ' .. LINE_FEED .. 'Số phiếu chống là %s.', positiveVotesNumber, negativeVotesNumber )end---------------------------------------------------------------------------------- Status class--------------------------------------------------------------------------------local Status = Object:extend()function Status:new(...) local args, cfg = unpack({...}) -- Set cfg self.cfg = cfg -- Set startTime if args[1] then args.start = args[1] end -- Tương thích ngược phiên bản cũ if args.start and mw.text.trim(args.start) ~= '' then self.startTime = tonumber(Helper:formatDate(args.start, 'U')) else error('phải có tham số start và start không được rỗng') end -- Set maxTime self.maxTime = self:_getMaxTime(...)endfunction Status:_getMaxTime(...) local args, cfg, title = unpack({...}) if args[2] then args.max = args[2] end -- Tương thích ngược phiên bản cũ if title then return self.startTime + Helper:dayToSecond(tonumber(args.max) or (cfg.rootTitles[title.rootText] or {}).max or cfg.DEFAULT_MAX) end return self.startTime + Helper:dayToSecond(tonumber(args.max) or cfg.DEFAULT_MAX)endfunction Status:_getMinTime(...) local _, cfg, title = unpack({...}) return self.startTime + Helper:dayToSecond((cfg.rootTitles[title.rootText] or {}).min or cfg.DEFAULT_MIN)endfunction Status:_getConsiderExtensionTime(...) local _, cfg, title = unpack({...}) return self.startTime + Helper:dayToSecond((cfg.rootTitles[title.rootText] or {}).considerExtension or cfg.DEFAULT_CONSIDER_EXTENSION)endfunction Status:_getExtendedTime(...) local _, cfg, title = unpack({...}) return self.startTime + Helper:dayToSecond((cfg.rootTitles[title.rootText] or {}).extended or cfg.DEFAULT_EXTENDED)endfunction Status:_getInfo() local statusName, titleIndex local now = os.time() if now <= self.maxTime then statusName, titleIndex = 'VALID', 1 else statusName, titleIndex = 'INVALID', 1 end return statusName, titleIndexendfunction Status:_getParams() lang = lang or mw.language.getContentLanguage() local now = os.time() local params = {} params.MAXTIME = Helper:formatDate(self.maxTime, 'H:i:s d-m-Y') params.COUNTDOWNTOMAXTIME = Helper:countdown(lang:getDurationIntervals(self.maxTime - now)) if self.minTime then params.MINTIME = Helper:formatDate(self.minTime, 'H:i:s d-m-Y') params.COUNTDOWNTOMINTIME = Helper:countdown(lang:getDurationIntervals(self.minTime - now)) end if self.extendedTime then params.EXTENDEDTIME = Helper:formatDate(self.extendedTime, 'H:i:s d-m-Y') params.COUNTDOWNTOEXTENDEDTIME = Helper:countdown(lang:getDurationIntervals(self.extendedTime - now)) end return paramsend-- Cung cấp giá trị tham số title và background-- cho bản mẫu trung gian Status/corefunction Status:getValues() local statusName, titleIndex = self:_getInfo() local title = Helper:breakLines(Helper:substParams( self.cfg.statuses[statusName].titles[titleIndex], self:_getParams())) local votesNumberTitle = '' if self.positiveVotesNumber and self.negativeVotesNumber then votesNumberTitle = Helper:votesNumberTitle(self.positiveVotesNumber, self.negativeVotesNumber) end local background = self.cfg.statuses[statusName].background return {title = title .. votesNumberTitle, background = background}end---------------------------------------------------------------------------------- StatusWithMinTime class extends Status class--------------------------------------------------------------------------------local StatusWithMinTime = Status:extend()function StatusWithMinTime:new(...) StatusWithMinTime.super.new(self, ...) local _, cfg, title = unpack({...}) -- Set minTime self.minTime = self:_getMinTime(...) -- Set positiveVotesNumber & negativeVotesNumber self.positiveVotesNumber, self.negativeVotesNumber = CountVotes(title) -- Set checkSuccessConclusionFunc self.checkSuccessConclusionFunc = (cfg.rootTitles[title.rootText] or {}).checkSuccessConclusionFuncendfunction StatusWithMinTime:_getInfo() local statusName, titleIndex local now = os.time() if now <= self.minTime then statusName, titleIndex = 'VALID', 2 elseif self.minTime < now and now <= self.maxTime then if not self.checkSuccessConclusionFunc(self.positiveVotesNumber, self.negativeVotesNumber) then statusName, titleIndex = 'VALID', 3 else statusName, titleIndex = 'VALID_AND_MAY_BE_CONSIDERED_CLOSED', 1 end else statusName, titleIndex = 'INVALID', 2 end return statusName, titleIndexend---------------------------------------------------------------------------------- StatusWithExtendedTime class extends Status class--------------------------------------------------------------------------------local StatusWithExtendedTime = Status:extend()function StatusWithExtendedTime:new(...) StatusWithExtendedTime.super.new(self, ...) local args, cfg, title = unpack({...}) -- Set considerExtensionTime self.considerExtensionTime = self:_getConsiderExtensionTime(...) -- Set extendedTime self.extendedTime = self:_getExtendedTime(...) -- Set positiveVotesNumber & negativeVotesNumber self.positiveVotesNumber, self.negativeVotesNumber = CountVotes(title) -- Set checkValidExtensionFunc self.checkValidExtensionFunc = (cfg.rootTitles[title.rootText] or {}).checkValidExtensionFunc -- Set extend self.extend = yesno(args.extend) or falseendfunction StatusWithExtendedTime:_getInfo() local statusName, titleIndex local now = os.time() if now <= self.considerExtensionTime then statusName, titleIndex = 'VALID', 1 elseif self.considerExtensionTime < now and now <= self.maxTime then if not self.checkValidExtensionFunc(self.positiveVotesNumber, self.negativeVotesNumber) then statusName, titleIndex = 'VALID', 4 elseif not self.extend then statusName, titleIndex = 'VALID_AND_MAY_CONSIDER_EXTENSION', 1 else statusName, titleIndex = 'VALID_AND_HAS_BEEN_EXTENDED', 1 end elseif now <= self.extendedTime and self.extend then statusName, titleIndex = 'VALID_AND_IS_BEING_EXTENDED', 1 elseif now > self.extendedTime and self.extend then statusName, titleIndex = 'INVALID', 3 else statusName, titleIndex = 'INVALID', 1 end return statusName, titleIndexend---------------------------------------------------------------------------------- StatusWithMinTimeAndExtendedTime class extends Status class--------------------------------------------------------------------------------local StatusWithMinTimeAndExtendedTime = Status:extend()function StatusWithMinTimeAndExtendedTime:new(...) StatusWithMinTimeAndExtendedTime.super.new(self, ...) local args, cfg, title = unpack({...}) -- Set minTime self.minTime = self:_getMinTime(...) -- Set considerExtensionTime self.considerExtensionTime = self:_getConsiderExtensionTime(...) -- Set extendedTime self.extendedTime = self:_getExtendedTime(...) -- Set positiveVotesNumber & negativeVotesNumber self.positiveVotesNumber, self.negativeVotesNumber = CountVotes(title) -- Set checkSuccessConclusionFunc self.checkSuccessConclusionFunc = (cfg.rootTitles[title.rootText] or {}).checkSuccessConclusionFunc -- Set checkValidExtensionFunc self.checkValidExtensionFunc = (cfg.rootTitles[title.rootText] or {}).checkValidExtensionFunc -- Set extend self.extend = yesno(args.extend) or falseendfunction StatusWithMinTimeAndExtendedTime:_getInfo() local statusName, titleIndex local now = os.time() statusName, titleIndex = 'VALID', 1 if now <= self.minTime then statusName, titleIndex = 'VALID', 2 elseif self.minTime < now and now <= self.considerExtensionTime then if not self.checkSuccessConclusionFunc(self.positiveVotesNumber, self.negativeVotesNumber) then statusName, titleIndex = 'VALID', 3 else statusName, titleIndex = 'VALID_AND_MAY_BE_CONSIDERED_CLOSED', 1 end elseif self.considerExtensionTime < now and now <= self.maxTime then if (not self.checkValidExtensionFunc(self.positiveVotesNumber, self.negativeVotesNumber)) and (not self.checkSuccessConclusionFunc(self.positiveVotesNumber, self.negativeVotesNumber)) then statusName, titleIndex = 'VALID', 5 elseif not self.checkValidExtensionFunc(self.positiveVotesNumber, self.negativeVotesNumber) then statusName, titleIndex = 'VALID_AND_MAY_BE_CONSIDERED_CLOSED', 1 elseif not self.extend then statusName, titleIndex = 'VALID_AND_MAY_CONSIDER_EXTENSION', 2 else statusName, titleIndex = 'VALID_AND_HAS_BEEN_EXTENDED', 2 end elseif now <= self.extendedTime and self.extend then statusName, titleIndex = 'VALID_AND_IS_BEING_EXTENDED', 1 elseif now > self.extendedTime and self.extend then statusName, titleIndex = 'INVALID', 3 else statusName, titleIndex = 'INVALID', 2 end return statusName, titleIndexend---------------------------------------------------------------------------------- Exports--------------------------------------------------------------------------------local p = {}function p._exportClasses() -- This is used for testing purposes. return { Status = Status, StatusWithMinTime = StatusWithMinTime, StatusWithExtendedTime = StatusWithExtendedTime, StatusWithMinTimeAndExtendedTime = StatusWithMinTimeAndExtendedTime, }endfunction p._main(args, cfg) args = args or {} cfg = cfg or require(CONFIG_MODULE) local statusObj = {} if args.id then if mw.text.trim(args.id) ~= '' then local title = {} if tonumber(args.id) then title = mw.title.new(tonumber(args.id)) else title = mw.title.new(args.id) end local group = (cfg.rootTitles[title.rootText] or {}).group if group == 1 then statusObj = StatusWithMinTime(args, cfg, title) elseif group == 2 then statusObj = StatusWithExtendedTime(args, cfg, title) elseif group == 3 then statusObj = StatusWithMinTimeAndExtendedTime(args, cfg, title) else error('khu vực không được hỗ trợ') end else error('id không được rỗng') end else statusObj = Status(args, cfg) end return statusObj:getValues()endfunction p.main(frame) local args = frame:getParent().args local cfg = require(CONFIG_MODULE) return frame:expandTemplate{title = 'Status/core', args = p._main(args, cfg)}endreturn pThể loại:
- Mô đun trong giai đoạn beta
- Mô đun phụ thuộc vào mô đun bị khóa